summaryrefslogtreecommitdiff
path: root/Source/Core/AudioCommon/CoreAudioSoundStream.cpp
diff options
context:
space:
mode:
authorJasper St. Pierre <jstpierre@mecheye.net>2013-12-07 15:14:29 -0500
committerJasper St. Pierre <jstpierre@mecheye.net>2013-12-31 14:03:19 -0500
commit34692ab826abc8f8faa61bdb2280b742424528f1 (patch)
treeb0eedc645badbea316ff59c125eaf808b28777ec /Source/Core/AudioCommon/CoreAudioSoundStream.cpp
parent43e618682e8093602fc83dfa902ee7ae3fd3a4f6 (diff)
Remove unnecessary Src/ folders
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()
+{
+}