summaryrefslogtreecommitdiff
path: root/Source/Core/AudioCommon/CoreAudioSoundStream.cpp
diff options
context:
space:
mode:
authorRyan Houdek <Sonicadvance1@gmail.com>2013-12-31 19:18:30 -0600
committerRyan Houdek <Sonicadvance1@gmail.com>2013-12-31 19:18:30 -0600
commit1118226f270d2b44d10dd3cebd9f89fd38042680 (patch)
tree9dd80995633c70581443d40f58d6ac35837e0bd4 /Source/Core/AudioCommon/CoreAudioSoundStream.cpp
parent8d8b0fc884367bc4d433d698a790ef5badee6957 (diff)
parent16824d5fd17b43b156706bf02a8063b389604766 (diff)
Merge branch 'master' into buffer_storage
Diffstat (limited to 'Source/Core/AudioCommon/CoreAudioSoundStream.cpp')
-rw-r--r--Source/Core/AudioCommon/CoreAudioSoundStream.cpp135
1 files changed, 135 insertions, 0 deletions
diff --git a/Source/Core/AudioCommon/CoreAudioSoundStream.cpp b/Source/Core/AudioCommon/CoreAudioSoundStream.cpp
new file mode 100644
index 0000000000..967eaa4b0a
--- /dev/null
+++ b/Source/Core/AudioCommon/CoreAudioSoundStream.cpp
@@ -0,0 +1,135 @@
+// Copyright 2013 Dolphin Emulator Project
+// Licensed under GPLv2
+// Refer to the license.txt file included.
+
+#include <CoreServices/CoreServices.h>
+
+#include "CoreAudioSoundStream.h"
+
+OSStatus CoreAudioSound::callback(void *inRefCon,
+ AudioUnitRenderActionFlags *ioActionFlags,
+ const AudioTimeStamp *inTimeStamp, UInt32 inBusNumber,
+ UInt32 inNumberFrames, AudioBufferList *ioData)
+{
+ for (UInt32 i = 0; i < ioData->mNumberBuffers; i++)
+ ((CoreAudioSound *)inRefCon)->m_mixer->
+ Mix((short *)ioData->mBuffers[i].mData,
+ ioData->mBuffers[i].mDataByteSize / 4);
+
+ return noErr;
+}
+
+CoreAudioSound::CoreAudioSound(CMixer *mixer) : SoundStream(mixer)
+{
+}
+
+CoreAudioSound::~CoreAudioSound()
+{
+}
+
+bool CoreAudioSound::Start()
+{
+ OSStatus err;
+ AURenderCallbackStruct callback_struct;
+ AudioStreamBasicDescription format;
+ ComponentDescription desc;
+ Component component;
+
+ desc.componentType = kAudioUnitType_Output;
+ desc.componentSubType = kAudioUnitSubType_DefaultOutput;
+ desc.componentFlags = 0;
+ desc.componentFlagsMask = 0;
+ desc.componentManufacturer = kAudioUnitManufacturer_Apple;
+ component = FindNextComponent(NULL, &desc);
+ if (component == NULL) {
+ ERROR_LOG(AUDIO, "error finding audio component");
+ return false;
+ }
+
+ err = OpenAComponent(component, &audioUnit);
+ if (err != noErr) {
+ ERROR_LOG(AUDIO, "error opening audio component");
+ return false;
+ }
+
+ FillOutASBDForLPCM(format, m_mixer->GetSampleRate(),
+ 2, 16, 16, false, false, false);
+ err = AudioUnitSetProperty(audioUnit,
+ kAudioUnitProperty_StreamFormat,
+ kAudioUnitScope_Input, 0, &format,
+ sizeof(AudioStreamBasicDescription));
+ if (err != noErr) {
+ ERROR_LOG(AUDIO, "error setting audio format");
+ return false;
+ }
+
+ callback_struct.inputProc = callback;
+ callback_struct.inputProcRefCon = this;
+ err = AudioUnitSetProperty(audioUnit,
+ kAudioUnitProperty_SetRenderCallback,
+ kAudioUnitScope_Input, 0, &callback_struct,
+ sizeof callback_struct);
+ if (err != noErr) {
+ ERROR_LOG(AUDIO, "error setting audio callback");
+ return false;
+ }
+
+ err = AudioUnitSetParameter(audioUnit,
+ kHALOutputParam_Volume,
+ kAudioUnitParameterFlag_Output, 0,
+ m_volume / 100., 0);
+ if (err != noErr)
+ ERROR_LOG(AUDIO, "error setting volume");
+
+ err = AudioUnitInitialize(audioUnit);
+ if (err != noErr) {
+ ERROR_LOG(AUDIO, "error initializing audiounit");
+ return false;
+ }
+
+ err = AudioOutputUnitStart(audioUnit);
+ if (err != noErr) {
+ ERROR_LOG(AUDIO, "error starting audiounit");
+ return false;
+ }
+
+ return true;
+}
+
+void CoreAudioSound::SetVolume(int volume)
+{
+ OSStatus err;
+ m_volume = volume;
+
+ err = AudioUnitSetParameter(audioUnit,
+ kHALOutputParam_Volume,
+ kAudioUnitParameterFlag_Output, 0,
+ volume / 100., 0);
+ if (err != noErr)
+ ERROR_LOG(AUDIO, "error setting volume");
+}
+
+void CoreAudioSound::SoundLoop()
+{
+}
+
+void CoreAudioSound::Stop()
+{
+ OSStatus err;
+
+ err = AudioOutputUnitStop(audioUnit);
+ if (err != noErr)
+ ERROR_LOG(AUDIO, "error stopping audiounit");
+
+ err = AudioUnitUninitialize(audioUnit);
+ if (err != noErr)
+ ERROR_LOG(AUDIO, "error uninitializing audiounit");
+
+ err = CloseComponent(audioUnit);
+ if (err != noErr)
+ ERROR_LOG(AUDIO, "error closing audio component");
+}
+
+void CoreAudioSound::Update()
+{
+}