summaryrefslogtreecommitdiff
path: root/Source/Core/AudioCommon/Src/CoreAudioSoundStream.cpp
diff options
context:
space:
mode:
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();
}