summaryrefslogtreecommitdiff
path: root/Source/Core/AudioCommon/Src/CoreAudioSoundStream.cpp
diff options
context:
space:
mode:
authorSoren Jorvang <soren.jorvang@gmail.com>2010-05-31 05:05:53 +0000
committerSoren Jorvang <soren.jorvang@gmail.com>2010-05-31 05:05:53 +0000
commitfdd532356a66c17fa3b8b309680f92e03a5567db (patch)
tree4d9924d85546bd814ad0d4160087d53bceca777d /Source/Core/AudioCommon/Src/CoreAudioSoundStream.cpp
parent99e7a2ceac6c2f3ecb71208c3701df8dd7e5b9fc (diff)
Have the AudioUnit callback drive the internal mixer directly instead
of going through an intermediate thread and buffer. This seems to be how Core Audio is meant to be used, although I still haven't read the manual. Indeed, sound on OS X works perfectly now. git-svn-id: https://dolphin-emu.googlecode.com/svn/trunk@5555 8ced0084-cf51-0410-be5f-012b33b47a6e
Diffstat (limited to 'Source/Core/AudioCommon/Src/CoreAudioSoundStream.cpp')
-rw-r--r--Source/Core/AudioCommon/Src/CoreAudioSoundStream.cpp139
1 files changed, 52 insertions, 87 deletions
diff --git a/Source/Core/AudioCommon/Src/CoreAudioSoundStream.cpp b/Source/Core/AudioCommon/Src/CoreAudioSoundStream.cpp
index 00ffa32e75..e5268549b7 100644
--- a/Source/Core/AudioCommon/Src/CoreAudioSoundStream.cpp
+++ b/Source/Core/AudioCommon/Src/CoreAudioSoundStream.cpp
@@ -17,33 +17,23 @@
#include "CoreAudioSoundStream.h"
-volatile unsigned int numBytesToRender; /* XXX */
-
-typedef struct internal
-{
- AudioUnit audioUnit;
- short realtimeBuffer[1024]; /* XXX */
-};
-
OSStatus callback(void *inRefCon, AudioUnitRenderActionFlags *ioActionFlags,
const AudioTimeStamp *inTimeStamp, UInt32 inBusNumber,
UInt32 inNumberFrames, AudioBufferList *ioData)
{
- internal *soundStruct = (internal *)inRefCon;
-
- for (int i=0; i < (int)ioData->mNumberBuffers; i++)
+ for (UInt32 i = 0; i < ioData->mNumberBuffers; i++)
{
- memcpy(ioData->mBuffers[i].mData, &soundStruct->realtimeBuffer,
- ioData->mBuffers[i].mDataByteSize);
+ ((CoreAudioSound *)inRefCon)-> \
+ RenderSamples(ioData->mBuffers[i].mData,
+ ioData->mBuffers[i].mDataByteSize);
}
- numBytesToRender = ioData->mBuffers[0].mDataByteSize; /* XXX */
- return 0;
+ return noErr;
}
-void CoreAudioSound::SoundLoop()
+void CoreAudioSound::RenderSamples(void *target, UInt32 size)
{
- CoreAudioInit();
+ m_mixer->Mix((short *)target, size / 4);
}
CoreAudioSound::CoreAudioSound(CMixer *mixer) : SoundStream(mixer)
@@ -54,19 +44,12 @@ CoreAudioSound::~CoreAudioSound()
{
}
-bool CoreAudioSound::CoreAudioInit()
+bool CoreAudioSound::Start()
{
- ComponentDescription desc;
OSStatus err;
UInt32 enableIO;
AURenderCallbackStruct callback_struct;
AudioStreamBasicDescription format;
- UInt32 numSamplesPerSlice;
- UInt32 numSamplesPerSliceSize = sizeof numSamplesPerSlice;
-
- internal *soundStruct = (internal *)malloc(sizeof(internal));
- memset(soundStruct->realtimeBuffer, 0,
- sizeof soundStruct->realtimeBuffer);
desc.componentType = kAudioUnitType_Output;
desc.componentSubType = kAudioUnitSubType_HALOutput;
@@ -75,105 +58,87 @@ bool CoreAudioSound::CoreAudioInit()
desc.componentManufacturer = kAudioUnitManufacturer_Apple;
Component component = FindNextComponent(NULL, &desc);
- if (component == NULL)
+ if (component == NULL) {
printf("error finding audio component\n");
+ return false;
+ }
- err = OpenAComponent(component, &soundStruct->audioUnit);
- if (err)
+ err = OpenAComponent(component, &audioUnit);
+ if (err != noErr) {
printf("error opening audio component\n");
+ return false;
+ }
- //enable output device
enableIO = 1;
- AudioUnitSetProperty(soundStruct->audioUnit,
+ AudioUnitSetProperty(audioUnit,
kAudioOutputUnitProperty_EnableIO,
kAudioUnitScope_Output, 0, &enableIO,
sizeof enableIO);
- //set audio format
FillOutASBDForLPCM(format, m_mixer->GetSampleRate(),
2, 16, 16, false, false, false);
- err = AudioUnitSetProperty(soundStruct->audioUnit,
+ err = AudioUnitSetProperty(audioUnit,
kAudioUnitProperty_StreamFormat,
kAudioUnitScope_Input, 0, &format,
sizeof(AudioStreamBasicDescription));
- if (err)
+ if (err != noErr) {
printf("error setting audio format\n");
+ return false;
+ }
callback_struct.inputProc = callback;
- callback_struct.inputProcRefCon = soundStruct;
- err = AudioUnitSetProperty(soundStruct->audioUnit,
+ callback_struct.inputProcRefCon = this;
+ err = AudioUnitSetProperty(audioUnit,
kAudioUnitProperty_SetRenderCallback,
kAudioUnitScope_Input, 0, &callback_struct,
sizeof callback_struct);
- if (err)
+ if (err != noErr) {
printf("error setting audio callback\n");
+ return false;
+ }
- err = AudioUnitGetProperty(soundStruct->audioUnit,
- kAudioUnitProperty_MaximumFramesPerSlice,
- kAudioUnitScope_Global, 0,
- &numSamplesPerSlice, &numSamplesPerSliceSize);
- if (err)
- printf("error getting audio buffer size\n");
-
- numBytesToRender = numSamplesPerSlice * 4;
-
- err = AudioUnitInitialize(soundStruct->audioUnit);
- if (err)
+ err = AudioUnitInitialize(audioUnit);
+ if (err != noErr) {
printf("error initializing audiounit\n");
+ return false;
+ }
- err = AudioOutputUnitStart(soundStruct->audioUnit);
- if (err)
+ err = AudioOutputUnitStart(audioUnit);
+ if (err != noErr) {
printf("error starting audiounit\n");
+ return false;
+ }
- do
- {
- soundCriticalSection.Enter();
- m_mixer->Mix(soundStruct->realtimeBuffer, numBytesToRender);
- soundCriticalSection.Leave();
- soundSyncEvent.Wait();
- } while(!threadData);
-
- err = AudioOutputUnitStop(soundStruct->audioUnit);
- if (err)
- printf("error stopping audiounit\n");
-
- err = AudioUnitUninitialize(soundStruct->audioUnit);
- if (err)
- printf("error uninitializing audiounit\n");
-
- err = CloseComponent(soundStruct->audioUnit);
- if (err)
- printf("error while closing audio component\n");
-
- free(soundStruct);
return true;
}
-void *coreAudioThread(void *args)
-{
-
- ((CoreAudioSound *)args)->SoundLoop();
- return NULL;
-}
-
-bool CoreAudioSound::Start()
+void CoreAudioSound::SoundLoop()
{
- soundSyncEvent.Init();
- thread = new Common::Thread(coreAudioThread, (void *)this);
- return true;
}
void CoreAudioSound::Stop()
{
- threadData = 1;
- soundSyncEvent.Set();
- delete thread;
- thread = NULL;
+ OSStatus err;
- return;
+ err = AudioOutputUnitStop(audioUnit);
+ if (err != noErr) {
+ printf("error stopping audiounit\n");
+ return;
+ }
+
+ err = AudioUnitUninitialize(audioUnit);
+ if (err != noErr) {
+ printf("error uninitializing audiounit\n");
+ return;
+ }
+
+ err = CloseComponent(audioUnit);
+ if (err != noErr) {
+ printf("error while closing audio component\n");
+ return;
+ }
}
void CoreAudioSound::Update()
{
- soundSyncEvent.Set();
}