Практическое руководство. Сдвиг звука
В этом разделе показано, как задать матрицу вывода монофонического исходного голоса, который выводится в стереофонический голос для сдвига между левым и правым динамиками.
Настройка сдвига
Получите конфигурацию говорящего с помощью IXAudio2MasteringVoice::GetChannelMask.
DWORD dwChannelMask; pMasteringVoice->GetChannelMask( &dwChannelMask );
Создайте массив для хранения выходной матрицы. Минимальный размер выходной матрицы — это количество каналов в исходном голосе, раз больше, чем количество каналов в выходном голосе. В этом случае массив из восьми элементов будет обрабатывать монозвучный вывод в любой выходной формат до 7.1 объемного звука.
float outputMatrix[ 8 ]; for (int i=0; i<8; i++) outputMatrix[i] = 0;
Вычисляйте уровни отправки на основе требуемого сдвига между левым и правым динамиками. В этом примере значения сдвига будут варьироваться от -1 до 1, при этом значение -1 указывает на весь звук в левом динамике и 1 — на правый динамик.
// pan of -1.0 indicates all left speaker, // 1.0 is all right speaker, 0.0 is split between left and right float left = 0.5f - pan / 2; float right = 0.5f + pan / 2;
Задайте индексы матрицы вывода, соответствующие левому и правому динамикам, со значениями, вычисленными на предыдущем шаге. Левый и правый динамики определяются путем просмотра маски канала, возвращенной IXAudio2MasteringVoice::GetChannelMask. Так как каналы всегда должны быть закодированы в порядке, указанном на странице ссылки WAVEFORMATEXTENSIBLE , можно определить индекс массива, соответствующий отдельному динамику.
switch (dwChannelMask) { case SPEAKER_MONO: outputMatrix[0] = 1.0; break; case SPEAKER_STEREO: case SPEAKER_2POINT1: case SPEAKER_SURROUND: outputMatrix[0] = left; outputMatrix[1] = right; break; case SPEAKER_QUAD: outputMatrix[0] = outputMatrix[2] = left; outputMatrix[1] = outputMatrix[3] = right; break; case SPEAKER_4POINT1: outputMatrix[ 0 ] = outputMatrix[ 3 ] = left; outputMatrix[ 1 ] = outputMatrix[ 4 ] = right; break; case SPEAKER_5POINT1: case SPEAKER_7POINT1: case SPEAKER_5POINT1_SURROUND: outputMatrix[ 0 ] = outputMatrix[ 4 ] = left; outputMatrix[ 1 ] = outputMatrix[ 5 ] = right; break; case SPEAKER_7POINT1_SURROUND: outputMatrix[ 0 ] = outputMatrix[ 4 ] = outputMatrix[ 6 ] = left; outputMatrix[ 1 ] = outputMatrix[ 5 ] = outputMatrix[ 7 ] = right; break; }
Примените матрицу вывода к исходному голосу с помощью IXAudio2Voice::SetOutputMatrix. Исходный голос будет либо исходным голосом, либо голосом субмикса, отправляющимся в голос субмикса или голос мастеринга. Сведения об исходных и целевых голосах, например о количестве каналов, можно получить с помощью IXAudio2Voice::GetVoiceDetails.
// Assuming pVoice sends to pMasteringVoice XAUDIO2_VOICE_DETAILS VoiceDetails; pVoice->GetVoiceDetails(&VoiceDetails); XAUDIO2_VOICE_DETAILS MasterVoiceDetails; pMasteringVoice->GetVoiceDetails(&MasterVoiceDetails); pVoice->SetOutputMatrix( NULL, VoiceDetails.InputChannels, MasterVoiceDetails.InputChannels, outputMatrix );
Связанные темы