@@ -235,6 +235,7 @@ private: | |||
SharedResourcePointer<AudioSessionHolder> sessionHolder; | |||
JUCE_DECLARE_WEAK_REFERENCEABLE (iOSAudioIODeviceType) | |||
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (iOSAudioIODeviceType) | |||
}; | |||
@@ -242,7 +243,7 @@ private: | |||
struct iOSAudioIODevice::Pimpl : public AudioPlayHead, | |||
public AsyncUpdater | |||
{ | |||
Pimpl (iOSAudioIODeviceType& ioDeviceType, iOSAudioIODevice& ioDevice) | |||
Pimpl (iOSAudioIODeviceType* ioDeviceType, iOSAudioIODevice& ioDevice) | |||
: deviceType (ioDeviceType), | |||
owner (ioDevice) | |||
{ | |||
@@ -416,7 +417,8 @@ struct iOSAudioIODevice::Pimpl : public AudioPlayHead, | |||
updateAvailableSampleRates(); | |||
updateAvailableBufferSizes(); | |||
deviceType.callDeviceChangeListeners(); | |||
if (deviceType != nullptr) | |||
deviceType->callDeviceChangeListeners(); | |||
} | |||
void setTargetSampleRateAndBufferSize() | |||
@@ -1310,7 +1312,7 @@ struct iOSAudioIODevice::Pimpl : public AudioPlayHead, | |||
MidiMessageCollector* messageCollector = nullptr; | |||
iOSAudioIODeviceType& deviceType; | |||
WeakReference<iOSAudioIODeviceType> deviceType; | |||
iOSAudioIODevice& owner; | |||
CriticalSection callbackLock; | |||
@@ -1330,7 +1332,7 @@ struct iOSAudioIODevice::Pimpl : public AudioPlayHead, | |||
}; | |||
//============================================================================== | |||
iOSAudioIODevice::iOSAudioIODevice (iOSAudioIODeviceType& ioDeviceType, const String&, const String&) | |||
iOSAudioIODevice::iOSAudioIODevice (iOSAudioIODeviceType* ioDeviceType, const String&, const String&) | |||
: AudioIODevice (iOSAudioDeviceName, iOSAudioDeviceName), | |||
pimpl (new Pimpl (ioDeviceType, *this)) | |||
{ | |||
@@ -1404,7 +1406,7 @@ bool iOSAudioIODeviceType::hasSeparateInputsAndOutputs() const { retu | |||
AudioIODevice* iOSAudioIODeviceType::createDevice (const String& outputDeviceName, const String& inputDeviceName) | |||
{ | |||
return new iOSAudioIODevice (*this, outputDeviceName, inputDeviceName); | |||
return new iOSAudioIODevice (this, outputDeviceName, inputDeviceName); | |||
} | |||
void iOSAudioIODeviceType::handleRouteChange (AVAudioSessionRouteChangeReason) | |||
@@ -77,7 +77,7 @@ public: | |||
private: | |||
//============================================================================== | |||
iOSAudioIODevice (iOSAudioIODeviceType&, const String&, const String&); | |||
iOSAudioIODevice (iOSAudioIODeviceType*, const String&, const String&); | |||
//============================================================================== | |||
friend class iOSAudioIODeviceType; | |||
@@ -887,7 +887,9 @@ private: | |||
case kAudioDevicePropertyDeviceHasChanged: | |||
case kAudioObjectPropertyOwnedObjects: | |||
intern->owner.restart(); | |||
intern->owner.deviceType.triggerAsyncAudioDeviceListChange(); | |||
if (intern->owner.deviceType != nullptr) | |||
intern->owner.deviceType->triggerAsyncAudioDeviceListChange(); | |||
break; | |||
case kAudioDevicePropertyBufferSizeRange: | |||
@@ -946,7 +948,7 @@ class CoreAudioIODevice : public AudioIODevice, | |||
private Timer | |||
{ | |||
public: | |||
CoreAudioIODevice (CoreAudioIODeviceType& dt, | |||
CoreAudioIODevice (CoreAudioIODeviceType* dt, | |||
const String& deviceName, | |||
AudioDeviceID inputDeviceId, const int inputIndex_, | |||
AudioDeviceID outputDeviceId, const int outputIndex_) | |||
@@ -1109,7 +1111,8 @@ public: | |||
void audioDeviceListChanged() | |||
{ | |||
deviceType.audioDeviceListChanged(); | |||
if (deviceType != nullptr) | |||
deviceType->audioDeviceListChanged(); | |||
} | |||
void restart() | |||
@@ -1146,7 +1149,7 @@ public: | |||
deviceWrapperRestartCallback = cb; | |||
} | |||
CoreAudioIODeviceType& deviceType; | |||
WeakReference<CoreAudioIODeviceType> deviceType; | |||
int inputIndex, outputIndex; | |||
private: | |||
@@ -1199,7 +1202,7 @@ class AudioIODeviceCombiner : public AudioIODevice, | |||
private Timer | |||
{ | |||
public: | |||
AudioIODeviceCombiner (const String& deviceName, CoreAudioIODeviceType& deviceType) | |||
AudioIODeviceCombiner (const String& deviceName, CoreAudioIODeviceType* deviceType) | |||
: AudioIODevice (deviceName, "CoreAudio"), | |||
Thread (deviceName), | |||
owner (deviceType) | |||
@@ -1553,7 +1556,7 @@ public: | |||
} | |||
private: | |||
CoreAudioIODeviceType& owner; | |||
WeakReference<CoreAudioIODeviceType> owner; | |||
CriticalSection callbackLock; | |||
AudioIODeviceCallback* callback = nullptr; | |||
AudioIODeviceCallback* previousCallback = nullptr; | |||
@@ -1775,8 +1778,8 @@ private: | |||
} | |||
} | |||
if (anySampleRateChanges) | |||
owner.audioDeviceListChanged(); | |||
if (anySampleRateChanges && owner != nullptr) | |||
owner->audioDeviceListChanged(); | |||
if (callback != nullptr) | |||
callback->audioDeviceAboutToStart (device); | |||
@@ -2160,20 +2163,20 @@ public: | |||
: outputDeviceName; | |||
if (inputDeviceID == outputDeviceID) | |||
return new CoreAudioIODevice (*this, combinedName, inputDeviceID, inputIndex, outputDeviceID, outputIndex); | |||
return new CoreAudioIODevice (this, combinedName, inputDeviceID, inputIndex, outputDeviceID, outputIndex); | |||
std::unique_ptr<CoreAudioIODevice> in, out; | |||
if (inputDeviceID != 0) | |||
in.reset (new CoreAudioIODevice (*this, inputDeviceName, inputDeviceID, inputIndex, 0, -1)); | |||
in.reset (new CoreAudioIODevice (this, inputDeviceName, inputDeviceID, inputIndex, 0, -1)); | |||
if (outputDeviceID != 0) | |||
out.reset (new CoreAudioIODevice (*this, outputDeviceName, 0, -1, outputDeviceID, outputIndex)); | |||
out.reset (new CoreAudioIODevice (this, outputDeviceName, 0, -1, outputDeviceID, outputIndex)); | |||
if (in == nullptr) return out.release(); | |||
if (out == nullptr) return in.release(); | |||
std::unique_ptr<AudioIODeviceCombiner> combo (new AudioIODeviceCombiner (combinedName, *this)); | |||
std::unique_ptr<AudioIODeviceCombiner> combo (new AudioIODeviceCombiner (combinedName, this)); | |||
combo->addDevice (in.release(), true, false); | |||
combo->addDevice (out.release(), false, true); | |||
return combo.release(); | |||
@@ -2235,6 +2238,7 @@ private: | |||
audioDeviceListChanged(); | |||
} | |||
JUCE_DECLARE_WEAK_REFERENCEABLE (CoreAudioIODeviceType) | |||
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (CoreAudioIODeviceType) | |||
}; | |||
@@ -1518,7 +1518,7 @@ private: | |||
class ChangeNotificationClient : public ComBaseClassHelper<IMMNotificationClient> | |||
{ | |||
public: | |||
ChangeNotificationClient (WASAPIAudioIODeviceType& d) | |||
ChangeNotificationClient (WASAPIAudioIODeviceType* d) | |||
: ComBaseClassHelper<IMMNotificationClient> (0), device (d) {} | |||
HRESULT STDMETHODCALLTYPE OnDeviceAdded (LPCWSTR) { return notify(); } | |||
@@ -1528,9 +1528,15 @@ private: | |||
HRESULT STDMETHODCALLTYPE OnPropertyValueChanged (LPCWSTR, const PROPERTYKEY) { return notify(); } | |||
private: | |||
WASAPIAudioIODeviceType& device; | |||
WeakReference<WASAPIAudioIODeviceType> device; | |||
HRESULT notify() { device.triggerAsyncDeviceChangeCallback(); return S_OK; } | |||
HRESULT notify() | |||
{ | |||
if (device != nullptr) | |||
device->triggerAsyncDeviceChangeCallback(); | |||
return S_OK; | |||
} | |||
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ChangeNotificationClient) | |||
}; | |||
@@ -1571,7 +1577,7 @@ private: | |||
if (! check (enumerator.CoCreateInstance (__uuidof (MMDeviceEnumerator)))) | |||
return; | |||
notifyClient = new ChangeNotificationClient (*this); | |||
notifyClient = new ChangeNotificationClient (this); | |||
enumerator->RegisterEndpointNotificationCallback (notifyClient); | |||
} | |||
@@ -1660,6 +1666,7 @@ private: | |||
} | |||
//============================================================================== | |||
JUCE_DECLARE_WEAK_REFERENCEABLE (WASAPIAudioIODeviceType) | |||
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (WASAPIAudioIODeviceType) | |||
}; | |||