void CAAudioHardwareSystem::AddPropertyListener(AudioHardwarePropertyID inPropertyID, AudioHardwarePropertyListenerProc inListenerProc, void* inClientData) { OSStatus theError = AudioHardwareAddPropertyListener(inPropertyID, inListenerProc, inClientData); ThrowIfError(theError, CAException(theError), "CAAudioHardwareSystem::AddPropertyListener: got an error adding a property listener"); }
JNIEXPORT jint JNICALL Java_com_apple_audio_hardware_AudioHardware_AudioHardwareAddPropertyListener (JNIEnv *, jclass, jint inPropertyID, jint inProc, jint inClientData) { return (jint)AudioHardwareAddPropertyListener((AudioHardwarePropertyID)inPropertyID, (AudioHardwarePropertyListenerProc)inProc, (void *)inClientData); }
// ---------------------------------------------------------------------------- void AudioCoreDriver::initialize(PlayerLibSidplay* player, int sampleRate, int bitsPerSample) // ---------------------------------------------------------------------------- { if (mInstanceId != 0) return; mPlayer = player; mNumSamplesInBuffer = 512; mIsPlaying = false; mIsPlayingPreRenderedBuffer = false; mBufferUnderrunDetected = false; mBufferUnderrunCount = 0; mSpectrumTemporalSmoothing = 0.5f; mPreRenderedBuffer = NULL; mPreRenderedBufferSampleCount = 0; mPreRenderedBufferPlaybackPosition = 0; if (!mIsInitialized) { OSStatus err; //get default output device UInt32 propertySize = sizeof(mDeviceID); AudioObjectPropertyAddress prop1 = {kAudioHardwarePropertyDefaultOutputDevice, kAudioObjectPropertyScopeGlobal, kAudioObjectPropertyElementMaster}; err = AudioObjectGetPropertyData(kAudioObjectSystemObject, &prop1, 0, NULL, &propertySize, &mDeviceID); if (err != kAudioHardwareNoError) { printf("AudioObjectGetPropertyData(kAudioHardwarePropertyDefaultOutputDevice) failed\n"); return; } if (mDeviceID == kAudioDeviceUnknown) return; err = queryStreamFormat(mDeviceID, mStreamFormat); if (err != kAudioHardwareNoError) { printf("queryStreamFormat failed\n"); return; } //add property listeners #if USE_NEW_API AudioObjectPropertyAddress prop5 = { kAudioDevicePropertyStreamFormat, //TODO this is deprecated, how to get this notification? kAudioObjectPropertyScopeGlobal, kAudioObjectPropertyElementMaster }; err = AudioObjectAddPropertyListener(mDeviceID, &prop5, streamFormatChanged, (void*)this); if (err != kAudioHardwareNoError) { printf("AudioObjectAddPropertyListener(streamFormatChanged) failed\n"); return; } AudioObjectPropertyAddress prop6 = { kAudioDeviceProcessorOverload, kAudioObjectPropertyScopeGlobal, kAudioObjectPropertyElementMaster }; err = AudioObjectAddPropertyListener(mDeviceID, &prop6, overloadDetected, (void*)this); if (err != kAudioHardwareNoError) { printf("AudioObjectAddPropertyListener(overloadDetected) failed\n"); return; } AudioObjectPropertyAddress prop7 = { kAudioHardwarePropertyDefaultOutputDevice, kAudioObjectPropertyScopeGlobal, kAudioObjectPropertyElementMaster }; err = AudioObjectAddPropertyListener(mDeviceID, &prop7, deviceChanged, (void*)this); if (err != kAudioHardwareNoError) { printf("AudioObjectAddPropertyListener(deviceChanged) failed\n"); return; } #else if (AudioDeviceAddPropertyListener(mDeviceID, 0, false, kAudioDevicePropertyStreamFormat, streamFormatChanged, (void*) this) != kAudioHardwareNoError) return; if (AudioDeviceAddPropertyListener(mDeviceID, 0, false, kAudioDeviceProcessorOverload, overloadDetected, (void*) this) != kAudioHardwareNoError) return; if (AudioHardwareAddPropertyListener(kAudioHardwarePropertyDefaultOutputDevice, deviceChanged, (void*) this) != kAudioHardwareNoError) return; #endif mSampleBuffer1 = new short[mNumSamplesInBuffer]; memset(mSampleBuffer1, 0, sizeof(short) * mNumSamplesInBuffer); mSampleBuffer2 = new short[mNumSamplesInBuffer]; memset(mSampleBuffer2, 0, sizeof(short) * mNumSamplesInBuffer); mSpectrumBuffer = new float[mNumSamplesInBuffer/2]; memset(mSpectrumBuffer, 0, sizeof(float) * (mNumSamplesInBuffer/2)); mSampleBuffer = mSampleBuffer1; mRetSampleBuffer = mSampleBuffer2; int bufferByteSize = mNumSamplesInBuffer * mStreamFormat.mChannelsPerFrame * sizeof(float); propertySize = sizeof(bufferByteSize); #if USE_NEW_API AudioObjectPropertyAddress prop8 = { kAudioDevicePropertyBufferSize, kAudioObjectPropertyScopeGlobal, kAudioObjectPropertyElementMaster }; err = AudioObjectSetPropertyData(mDeviceID, &prop8, 0, NULL, propertySize, &bufferByteSize); if (err != kAudioHardwareNoError) { printf("AudioObjectSetPropertyData(kAudioDevicePropertyBufferSize) failed\n"); return; } #else if (AudioDeviceSetProperty(mDeviceID, NULL, 0, false, kAudioDevicePropertyBufferSize, propertySize, &bufferByteSize) != kAudioHardwareNoError) return; #endif mScaleFactor = sBitScaleFactor; mPreRenderedBufferScaleFactor = sBitScaleFactor; if (AudioDeviceCreateIOProcID(mDeviceID, emulationPlaybackProc, (void*) this, &mEmulationPlaybackProcID) != kAudioHardwareNoError) { delete[] mSampleBuffer1; mSampleBuffer1 = NULL; delete[] mSampleBuffer2; mSampleBuffer2 = NULL; mSampleBuffer = NULL; mRetSampleBuffer = NULL; delete[] mSpectrumBuffer; mSpectrumBuffer = NULL; return; } if (AudioDeviceCreateIOProcID(mDeviceID, preRenderedBufferPlaybackProc, (void*) this, &mPreRenderedBufferPlaybackProcID) != kAudioHardwareNoError) { delete[] mSampleBuffer1; mSampleBuffer1 = NULL; delete[] mSampleBuffer2; mSampleBuffer2 = NULL; mSampleBuffer = NULL; mRetSampleBuffer = NULL; delete[] mSpectrumBuffer; mSpectrumBuffer = NULL; return; } } mVolume = 1.0f; mIsInitialized = true; }