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.cpp138
1 files changed, 70 insertions, 68 deletions
diff --git a/Source/Core/AudioCommon/Src/CoreAudioSoundStream.cpp b/Source/Core/AudioCommon/Src/CoreAudioSoundStream.cpp
index 680bc3a4d7..00ffa32e75 100644
--- a/Source/Core/AudioCommon/Src/CoreAudioSoundStream.cpp
+++ b/Source/Core/AudioCommon/Src/CoreAudioSoundStream.cpp
@@ -17,34 +17,35 @@
#include "CoreAudioSoundStream.h"
+volatile unsigned int numBytesToRender; /* XXX */
+
typedef struct internal
{
AudioUnit audioUnit;
- short realtimeBuffer[1024 * 1024];
+ short realtimeBuffer[1024]; /* XXX */
};
-
-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)
+{
internal *soundStruct = (internal *)inRefCon;
-
for (int i=0; i < (int)ioData->mNumberBuffers; i++)
{
- memcpy(ioData->mBuffers[i].mData, &soundStruct->realtimeBuffer, ioData->mBuffers[i].mDataByteSize);
-
+ memcpy(ioData->mBuffers[i].mData, &soundStruct->realtimeBuffer,
+ ioData->mBuffers[i].mDataByteSize);
}
+
+ numBytesToRender = ioData->mBuffers[0].mDataByteSize; /* XXX */
return 0;
}
-
-
-
void CoreAudioSound::SoundLoop()
{
CoreAudioInit();
-
}
+
CoreAudioSound::CoreAudioSound(CMixer *mixer) : SoundStream(mixer)
{
}
@@ -52,6 +53,7 @@ CoreAudioSound::CoreAudioSound(CMixer *mixer) : SoundStream(mixer)
CoreAudioSound::~CoreAudioSound()
{
}
+
bool CoreAudioSound::CoreAudioInit()
{
ComponentDescription desc;
@@ -59,21 +61,23 @@ bool CoreAudioSound::CoreAudioInit()
UInt32 enableIO;
AURenderCallbackStruct callback_struct;
AudioStreamBasicDescription format;
- UInt32 numBytesToRender = 512;
-
+ UInt32 numSamplesPerSlice;
+ UInt32 numSamplesPerSliceSize = sizeof numSamplesPerSlice;
+
internal *soundStruct = (internal *)malloc(sizeof(internal));
- memset(soundStruct->realtimeBuffer, 0, sizeof(soundStruct->realtimeBuffer));
-
+ memset(soundStruct->realtimeBuffer, 0,
+ sizeof soundStruct->realtimeBuffer);
+
desc.componentType = kAudioUnitType_Output;
desc.componentSubType = kAudioUnitSubType_HALOutput;
- desc.componentFlags = 0;
- desc.componentFlagsMask = 0;
+ desc.componentFlags = 0;
+ desc.componentFlagsMask = 0;
desc.componentManufacturer = kAudioUnitManufacturer_Apple;
Component component = FindNextComponent(NULL, &desc);
if (component == NULL)
- printf("error finding component\n");
-
+ printf("error finding audio component\n");
+
err = OpenAComponent(component, &soundStruct->audioUnit);
if (err)
printf("error opening audio component\n");
@@ -81,97 +85,95 @@ bool CoreAudioSound::CoreAudioInit()
//enable output device
enableIO = 1;
AudioUnitSetProperty(soundStruct->audioUnit,
- kAudioOutputUnitProperty_EnableIO,
- kAudioUnitScope_Output,
- 0,
- &enableIO,
- sizeof(enableIO));
-
-
- format.mBitsPerChannel = 16;
- format.mChannelsPerFrame = 2;
- format.mBytesPerPacket = 4;
- format.mBytesPerFrame = 4;
- format.mFormatFlags = kAudioFormatFlagIsSignedInteger | kAudioFormatFlagIsPacked;
- format.mFormatID = kAudioFormatLinearPCM;
- format.mFramesPerPacket = 1;
- format.mSampleRate = m_mixer->GetSampleRate();
-
- //set format to output scope
- err = AudioUnitSetProperty(soundStruct->audioUnit, kAudioUnitProperty_StreamFormat, kAudioUnitScope_Input, 0, &format, sizeof(AudioStreamBasicDescription));
+ 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,
+ kAudioUnitProperty_StreamFormat,
+ kAudioUnitScope_Input, 0, &format,
+ sizeof(AudioStreamBasicDescription));
if (err)
- printf("error when setting output format\n");
+ printf("error setting audio format\n");
-
callback_struct.inputProc = callback;
callback_struct.inputProcRefCon = soundStruct;
-
- err = AudioUnitSetProperty(soundStruct->audioUnit, kAudioUnitProperty_SetRenderCallback, kAudioUnitScope_Global, 0, &callback_struct, sizeof(callback_struct));
+ err = AudioUnitSetProperty(soundStruct->audioUnit,
+ kAudioUnitProperty_SetRenderCallback,
+ kAudioUnitScope_Input, 0, &callback_struct,
+ sizeof callback_struct);
if (err)
- printf("error when setting input callback\n");
+ printf("error setting audio callback\n");
+
+ 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)
- printf("error when initiaising audiounit\n");
-
+ printf("error initializing audiounit\n");
+
err = AudioOutputUnitStart(soundStruct->audioUnit);
if (err)
- printf("error when starting audiounit\n");
+ printf("error starting audiounit\n");
do
{
- soundCriticalSection.Enter();
+ soundCriticalSection.Enter();
m_mixer->Mix(soundStruct->realtimeBuffer, numBytesToRender);
soundCriticalSection.Leave();
soundSyncEvent.Wait();
- }while(!threadData);
+ } while(!threadData);
err = AudioOutputUnitStop(soundStruct->audioUnit);
- if(err)
- printf("error when sopping audiounit\n");
-
+ if (err)
+ printf("error stopping audiounit\n");
+
err = AudioUnitUninitialize(soundStruct->audioUnit);
- if(err)
- printf("Error uninitializing audiounit\n");
-
+ if (err)
+ printf("error uninitializing audiounit\n");
+
err = CloseComponent(soundStruct->audioUnit);
- if(err)
- printf("Error while closing component\n");
-
+ if (err)
+ printf("error while closing audio component\n");
+
free(soundStruct);
return true;
-
}
void *coreAudioThread(void *args)
{
- ((CoreAudioSound *)args)->SoundLoop();
- return NULL;
+ ((CoreAudioSound *)args)->SoundLoop();
+ return NULL;
}
-
bool CoreAudioSound::Start()
{
-
- soundSyncEvent.Init();
- thread = new Common::Thread(coreAudioThread, (void *)this);
+ soundSyncEvent.Init();
+ thread = new Common::Thread(coreAudioThread, (void *)this);
return true;
}
-
void CoreAudioSound::Stop()
{
threadData = 1;
soundSyncEvent.Set();
- delete thread;
- thread = NULL;
+ delete thread;
+ thread = NULL;
return;
-
}
+
void CoreAudioSound::Update()
{
soundSyncEvent.Set();
-
}