coreaudio backend make sound now
git-svn-id: https://dolphin-emu.googlecode.com/svn/trunk@4814 8ced0084-cf51-0410-be5f-012b33b47a6e
This commit is contained in:
parent
af08186daa
commit
4172928b14
|
@ -26,18 +26,14 @@ typedef struct internal
|
||||||
|
|
||||||
OSStatus callback(void *inRefCon, AudioUnitRenderActionFlags *ioActionFlags, const AudioTimeStamp *inTimeStamp, UInt32 inBusNumber, UInt32 inNumberFrames, AudioBufferList *ioData) {
|
OSStatus callback(void *inRefCon, AudioUnitRenderActionFlags *ioActionFlags, const AudioTimeStamp *inTimeStamp, UInt32 inBusNumber, UInt32 inNumberFrames, AudioBufferList *ioData) {
|
||||||
|
|
||||||
UInt32 remaining, len;
|
|
||||||
void *ptr;
|
|
||||||
AudioBuffer *data;
|
|
||||||
|
|
||||||
internal *soundStruct = (internal *)inRefCon;
|
internal *soundStruct = (internal *)inRefCon;
|
||||||
|
|
||||||
data = &ioData->mBuffers[0];
|
|
||||||
len = data->mDataByteSize;
|
|
||||||
ptr = data->mData;
|
|
||||||
|
|
||||||
memcpy(ptr, soundStruct->realtimeBuffer, len);
|
for (int i=0; i < (int)ioData->mNumberBuffers; i++)
|
||||||
|
{
|
||||||
|
memcpy(ioData->mBuffers[i].mData, &soundStruct->realtimeBuffer, ioData->mBuffers[i].mDataByteSize);
|
||||||
|
|
||||||
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -62,13 +58,16 @@ bool CoreAudioSound::CoreAudioInit()
|
||||||
OSStatus err;
|
OSStatus err;
|
||||||
UInt32 enableIO;
|
UInt32 enableIO;
|
||||||
AURenderCallbackStruct callback_struct;
|
AURenderCallbackStruct callback_struct;
|
||||||
UInt32 shouldAllocateBuffer = 1;
|
|
||||||
AudioStreamBasicDescription format;
|
AudioStreamBasicDescription format;
|
||||||
|
UInt32 numBytesToRender = 512;
|
||||||
|
|
||||||
internal *soundStruct = (internal *)malloc(sizeof(internal));
|
internal *soundStruct = (internal *)malloc(sizeof(internal));
|
||||||
|
memset(soundStruct->realtimeBuffer, 0, sizeof(soundStruct->realtimeBuffer));
|
||||||
|
|
||||||
desc.componentType = kAudioUnitType_Output;
|
desc.componentType = kAudioUnitType_Output;
|
||||||
desc.componentSubType = kAudioUnitSubType_HALOutput;
|
desc.componentSubType = kAudioUnitSubType_HALOutput;
|
||||||
|
desc.componentFlags = 0;
|
||||||
|
desc.componentFlagsMask = 0;
|
||||||
desc.componentManufacturer = kAudioUnitManufacturer_Apple;
|
desc.componentManufacturer = kAudioUnitManufacturer_Apple;
|
||||||
|
|
||||||
Component component = FindNextComponent(NULL, &desc);
|
Component component = FindNextComponent(NULL, &desc);
|
||||||
|
@ -88,22 +87,18 @@ bool CoreAudioSound::CoreAudioInit()
|
||||||
&enableIO,
|
&enableIO,
|
||||||
sizeof(enableIO));
|
sizeof(enableIO));
|
||||||
|
|
||||||
AudioUnitSetProperty(soundStruct->audioUnit, kAudioUnitProperty_ShouldAllocateBuffer, kAudioUnitScope_Global, 1, &shouldAllocateBuffer, sizeof(shouldAllocateBuffer));
|
|
||||||
if (err)
|
|
||||||
printf("error while allocate audiounit buffer\n");
|
|
||||||
|
|
||||||
|
|
||||||
format.mBitsPerChannel = 16;
|
format.mBitsPerChannel = 16;
|
||||||
format.mChannelsPerFrame = 2;
|
format.mChannelsPerFrame = 2;
|
||||||
format.mBytesPerPacket = sizeof(float);
|
format.mBytesPerPacket = 4;
|
||||||
format.mBytesPerFrame = sizeof(float);
|
format.mBytesPerFrame = 4;
|
||||||
format.mFormatFlags = kAudioFormatFlagsNativeFloatPacked | kLinearPCMFormatFlagIsNonInterleaved;
|
format.mFormatFlags = kAudioFormatFlagIsSignedInteger | kAudioFormatFlagIsPacked;
|
||||||
format.mFormatID = kAudioFormatLinearPCM;
|
format.mFormatID = kAudioFormatLinearPCM;
|
||||||
format.mFramesPerPacket = 1;
|
format.mFramesPerPacket = 1;
|
||||||
format.mSampleRate = m_mixer->GetSampleRate();
|
format.mSampleRate = m_mixer->GetSampleRate();
|
||||||
|
|
||||||
//set format to output scope
|
//set format to output scope
|
||||||
err = AudioUnitSetProperty(soundStruct->audioUnit, kAudioUnitProperty_StreamFormat, kAudioUnitScope_Output, 1, &format, sizeof(AudioStreamBasicDescription));
|
err = AudioUnitSetProperty(soundStruct->audioUnit, kAudioUnitProperty_StreamFormat, kAudioUnitScope_Input, 0, &format, sizeof(AudioStreamBasicDescription));
|
||||||
if (err)
|
if (err)
|
||||||
printf("error when setting output format\n");
|
printf("error when setting output format\n");
|
||||||
|
|
||||||
|
@ -113,7 +108,7 @@ bool CoreAudioSound::CoreAudioInit()
|
||||||
|
|
||||||
err = AudioUnitSetProperty(soundStruct->audioUnit, kAudioUnitProperty_SetRenderCallback, kAudioUnitScope_Global, 0, &callback_struct, sizeof(callback_struct));
|
err = AudioUnitSetProperty(soundStruct->audioUnit, kAudioUnitProperty_SetRenderCallback, kAudioUnitScope_Global, 0, &callback_struct, sizeof(callback_struct));
|
||||||
if (err)
|
if (err)
|
||||||
printf("error when setting output callback\n");
|
printf("error when setting input callback\n");
|
||||||
|
|
||||||
err = AudioUnitInitialize(soundStruct->audioUnit);
|
err = AudioUnitInitialize(soundStruct->audioUnit);
|
||||||
if (err)
|
if (err)
|
||||||
|
@ -125,9 +120,11 @@ bool CoreAudioSound::CoreAudioInit()
|
||||||
|
|
||||||
while(!threadData)
|
while(!threadData)
|
||||||
{
|
{
|
||||||
m_mixer->Mix(soundStruct->realtimeBuffer, 2048);
|
soundCriticalSection.Enter();
|
||||||
|
m_mixer->Mix(soundStruct->realtimeBuffer, numBytesToRender);
|
||||||
|
soundCriticalSection.Leave();
|
||||||
|
soundSyncEvent.Wait();
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -144,9 +141,7 @@ bool CoreAudioSound::Start()
|
||||||
{
|
{
|
||||||
|
|
||||||
soundSyncEvent.Init();
|
soundSyncEvent.Init();
|
||||||
|
|
||||||
thread = new Common::Thread(coreAudioThread, (void *)this);
|
thread = new Common::Thread(coreAudioThread, (void *)this);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -161,6 +156,6 @@ void CoreAudioSound::Stop()
|
||||||
}
|
}
|
||||||
void CoreAudioSound::Update()
|
void CoreAudioSound::Update()
|
||||||
{
|
{
|
||||||
return;
|
soundSyncEvent.Set();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -122,10 +122,10 @@ void handle_event(struct wiimote_t* wm)
|
||||||
if (g_MotionSensing && !WIIUSE_USING_IR(wm))
|
if (g_MotionSensing && !WIIUSE_USING_IR(wm))
|
||||||
wiiuse_set_ir(wm, 1);
|
wiiuse_set_ir(wm, 1);
|
||||||
|
|
||||||
|
#if defined(HAVE_WX) && HAVE_WX
|
||||||
if (!m_RecordingConfigFrame) return;
|
if (!m_RecordingConfigFrame) return;
|
||||||
|
|
||||||
// Print battery status
|
// Print battery status
|
||||||
#if defined(HAVE_WX) && HAVE_WX
|
|
||||||
if(m_RecordingConfigFrame && g_Config.bUpdateRealWiimote)
|
if(m_RecordingConfigFrame && g_Config.bUpdateRealWiimote)
|
||||||
m_RecordingConfigFrame->m_GaugeBattery->SetValue((int)floor((wm->battery_level * 100) + 0.5));
|
m_RecordingConfigFrame->m_GaugeBattery->SetValue((int)floor((wm->battery_level * 100) + 0.5));
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -34,7 +34,9 @@
|
||||||
#include "EmuDefinitions.h"
|
#include "EmuDefinitions.h"
|
||||||
#define EXCLUDE_H // Avoid certain declarations in wiimote_real.h
|
#define EXCLUDE_H // Avoid certain declarations in wiimote_real.h
|
||||||
#include "wiimote_real.h"
|
#include "wiimote_real.h"
|
||||||
|
#if defined(HAVE_WX) && HAVE_WX
|
||||||
#include "ConfigRecordingDlg.h"
|
#include "ConfigRecordingDlg.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef WIN32
|
#ifdef WIN32
|
||||||
#include <bthdef.h>
|
#include <bthdef.h>
|
||||||
|
@ -560,7 +562,9 @@ THREAD_RETURN SafeCloseReadWiimote_ThreadFunc(void* arg)
|
||||||
|
|
||||||
if (g_RealWiiMoteInitialized)
|
if (g_RealWiiMoteInitialized)
|
||||||
Shutdown();
|
Shutdown();
|
||||||
|
#if defined(HAVE_WX) && HAVE_WX
|
||||||
m_RecordingConfigFrame->Close(true);
|
m_RecordingConfigFrame->Close(true);
|
||||||
|
#endif
|
||||||
if (!g_RealWiiMoteInitialized)
|
if (!g_RealWiiMoteInitialized)
|
||||||
Initialize();
|
Initialize();
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue