bool AudioRenderer::CheckFormat(SharedWaveFormat inputFormat, bool live) { assert(inputFormat); if (inputFormat->nChannels == 0 || inputFormat->nSamplesPerSec == 0 || inputFormat->wBitsPerSample == 0 || inputFormat->nBlockAlign * 8 != inputFormat->nChannels * inputFormat->wBitsPerSample || inputFormat->nChannels > 18) { return false; } if (DspFormatFromWaveFormat(*inputFormat) != DspFormat::Unknown) return true; BOOL exclusive; m_settings->GetOuputDevice(nullptr, &exclusive, nullptr); BOOL bitstreamingAllowed; m_settings->GetAllowBitstreaming(&bitstreamingAllowed); if (!exclusive || !bitstreamingAllowed || live) return false; CAutoLock objectLock(this); return m_deviceManager.BitstreamFormatSupported(inputFormat, m_settings) && !m_externalClock; }
MyPropertyPage::MyPropertyPage(SharedWaveFormat inputFormat, const AudioDevice* pDevice, std::vector<std::wstring> processors, bool externalClock, bool live) : CUnknown(L"SaneAudioRenderer::MyPropertyPage", nullptr) { std::wstring adapterField = (pDevice && pDevice->GetAdapterName()) ? *pDevice->GetAdapterName() : L"-"; std::wstring endpointField = (pDevice && pDevice->GetEndpointName()) ? *pDevice->GetEndpointName() : L"-"; std::wstring exclusiveField = (pDevice ? (pDevice->IsExclusive() ? L"Yes" : L"No") : L"-"); std::wstring bufferField = (pDevice ? std::to_wstring(pDevice->GetBufferDuration()) + L"ms" : L"-"); const bool bitstreaming = (inputFormat && DspFormatFromWaveFormat(*inputFormat) == DspFormat::Unknown); std::wstring bitstreamingField = (inputFormat ? (bitstreaming ? L"Yes" : L"No") : L"-"); std::wstring slavingField = live ? L"Live Source" : externalClock ? L"Graph Clock" : L"Audio Device"; std::wstring channelsInputField = (inputFormat && !bitstreaming) ? std::to_wstring(inputFormat->nChannels) + L" (" + GetHexString(DspMatrix::GetChannelMask(*inputFormat)) + L")" : L"-"; std::wstring channelsDeviceField = (pDevice && !bitstreaming) ? std::to_wstring(pDevice->GetWaveFormat()->nChannels) + L" (" + GetHexString(DspMatrix::GetChannelMask(*pDevice->GetWaveFormat())) + L")" : L"-"; std::wstring channelsField = (channelsInputField == channelsDeviceField) ? channelsInputField : channelsInputField + L" -> " + channelsDeviceField; std::wstring formatInputField = (inputFormat ? GetFormatString(*inputFormat) : L"-"); std::wstring formatDeviceField = (pDevice ? GetFormatString(*pDevice->GetWaveFormat()) : L"-"); std::wstring formatField = (formatInputField == formatDeviceField) ? formatInputField : formatInputField + L" -> " + formatDeviceField; std::wstring rateInputField = (inputFormat && !bitstreaming) ? std::to_wstring(inputFormat->nSamplesPerSec) : L"-"; std::wstring rateDeviceField = (pDevice && !bitstreaming) ? std::to_wstring(pDevice->GetWaveFormat()->nSamplesPerSec) : L"-"; std::wstring rateField = (rateInputField == rateDeviceField) ? rateInputField : rateInputField + L" -> " + rateDeviceField; std::wstring processorsField; for (const auto& s : processors) { if (!processorsField.empty()) processorsField += L", "; processorsField += s; } if (processorsField.empty()) processorsField = L"-"; WriteDialogHeader(m_dialogData, L"MS Shell Dlg", 8); WriteDialogItem(m_dialogData, BS_GROUPBOX, 0x0080FFFF, 5, 5, 210, 150, L"Renderer Status"); WriteDialogItem(m_dialogData, BS_TEXT | SS_RIGHT, 0x0082FFFF, 10, 20, 60, 8, L"Adapter:"); WriteDialogItem(m_dialogData, BS_TEXT | SS_LEFT, 0x0082FFFF, 73, 20, 130, 8, adapterField); WriteDialogItem(m_dialogData, BS_TEXT | SS_RIGHT, 0x0082FFFF, 10, 32, 60, 8, L"Endpoint:"); WriteDialogItem(m_dialogData, BS_TEXT | SS_LEFT, 0x0082FFFF, 73, 32, 130, 8, endpointField); WriteDialogItem(m_dialogData, BS_TEXT | SS_RIGHT, 0x0082FFFF, 10, 44, 60, 8, L"Exclusive:"); WriteDialogItem(m_dialogData, BS_TEXT | SS_LEFT, 0x0082FFFF, 73, 44, 130, 8, exclusiveField); WriteDialogItem(m_dialogData, BS_TEXT | SS_RIGHT, 0x0082FFFF, 10, 56, 60, 8, L"Buffer:"); WriteDialogItem(m_dialogData, BS_TEXT | SS_LEFT, 0x0082FFFF, 73, 56, 130, 8, bufferField); WriteDialogItem(m_dialogData, BS_TEXT | SS_RIGHT, 0x0082FFFF, 10, 68, 60, 8, L"Bitstreaming:"); WriteDialogItem(m_dialogData, BS_TEXT | SS_LEFT, 0x0082FFFF, 73, 68, 130, 8, bitstreamingField); WriteDialogItem(m_dialogData, BS_TEXT | SS_RIGHT, 0x0082FFFF, 10, 80, 60, 8, L"Slaving:"); WriteDialogItem(m_dialogData, BS_TEXT | SS_LEFT, 0x0082FFFF, 73, 80, 130, 8, slavingField); WriteDialogItem(m_dialogData, BS_TEXT | SS_RIGHT, 0x0082FFFF, 10, 92, 60, 8, L"Format:"); WriteDialogItem(m_dialogData, BS_TEXT | SS_LEFT, 0x0082FFFF, 73, 92, 130, 8, formatField); WriteDialogItem(m_dialogData, BS_TEXT | SS_RIGHT, 0x0082FFFF, 10, 104, 60, 8, L"Channels:"); WriteDialogItem(m_dialogData, BS_TEXT | SS_LEFT, 0x0082FFFF, 73, 104, 130, 8, channelsField); WriteDialogItem(m_dialogData, BS_TEXT | SS_RIGHT, 0x0082FFFF, 10, 116, 60, 8, L"Rate:"); WriteDialogItem(m_dialogData, BS_TEXT | SS_LEFT, 0x0082FFFF, 73, 116, 130, 8, rateField); WriteDialogItem(m_dialogData, BS_TEXT | SS_RIGHT, 0x0082FFFF, 10, 128, 60, 8, L"Processors:"); WriteDialogItem(m_dialogData, BS_TEXT | SS_LEFT, 0x0082FFFF, 73, 128, 130, 24, processorsField); }