// TODO: Should it even be possible to change both the // physical and virtual formats, since the devices do it themselves? void CCoreAudioStream::Close(bool restore) { if (!m_StreamId) return; std::string formatString; // remove the physical/virtual property listeners before we make changes // that will trigger callbacks that we do not care about. AudioObjectPropertyAddress propertyAOPA; propertyAOPA.mScope = kAudioObjectPropertyScopeGlobal; propertyAOPA.mElement = kAudioObjectPropertyElementMaster; propertyAOPA.mSelector = kAudioStreamPropertyPhysicalFormat; if (AudioObjectRemovePropertyListener(m_StreamId, &propertyAOPA, HardwareStreamListener, this) != noErr) CLog::Log(LOGDEBUG, "CCoreAudioStream::Close: Couldn't remove property listener."); propertyAOPA.mScope = kAudioObjectPropertyScopeGlobal; propertyAOPA.mElement = kAudioObjectPropertyElementMaster; propertyAOPA.mSelector = kAudioStreamPropertyVirtualFormat; if (AudioObjectRemovePropertyListener(m_StreamId, &propertyAOPA, HardwareStreamListener, this) != noErr) CLog::Log(LOGDEBUG, "CCoreAudioStream::Close: Couldn't remove property listener."); // Revert any format changes we made if (restore && m_OriginalVirtualFormat.mFormatID && m_StreamId) { CLog::Log(LOGDEBUG, "CCoreAudioStream::Close: " "Restoring original virtual format for stream 0x%04x. (%s)", (uint)m_StreamId, StreamDescriptionToString(m_OriginalVirtualFormat, formatString)); AudioStreamBasicDescription setFormat = m_OriginalVirtualFormat; SetVirtualFormat(&setFormat); } if (restore && m_OriginalPhysicalFormat.mFormatID && m_StreamId) { CLog::Log(LOGDEBUG, "CCoreAudioStream::Close: " "Restoring original physical format for stream 0x%04x. (%s)", (uint)m_StreamId, StreamDescriptionToString(m_OriginalPhysicalFormat, formatString)); AudioStreamBasicDescription setFormat = m_OriginalPhysicalFormat; SetPhysicalFormat(&setFormat); } m_OriginalVirtualFormat.mFormatID = 0; m_OriginalPhysicalFormat.mFormatID = 0; CLog::Log(LOGDEBUG, "CCoreAudioStream::Close: Closed stream 0x%04x.", (uint)m_StreamId); m_StreamId = 0; }
// TODO: Should it even be possible to change both the physical and virtual formats, since the devices do it themselves? void CCoreAudioStream::Close() { if (!m_StreamId) return; // Revert any format changes we made if (m_OriginalVirtualFormat.mFormatID && m_StreamId) { CLog::Log(LOGDEBUG, "CCoreAudioStream::Close: Restoring original virtual format for stream 0x%04x.", m_StreamId); SetVirtualFormat(&m_OriginalVirtualFormat); } if (m_OriginalPhysicalFormat.mFormatID && m_StreamId) { CLog::Log(LOGDEBUG, "CCoreAudioStream::Close: Restoring original physical format for stream 0x%04x.", m_StreamId); SetPhysicalFormat(&m_OriginalPhysicalFormat); } m_OriginalPhysicalFormat.mFormatID = 0; m_OriginalVirtualFormat.mFormatID = 0; CLog::Log(LOGDEBUG, "CCoreAudioStream::Close: Closed stream 0x%04x.", m_StreamId); m_StreamId = 0; }