Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
В этом разделе показано, как настроить выходную матрицу моно исходного голоса, выводящегося в стерео-мастеринг, для достижения панорамы между левым и правым динамиками.
Настройка панорамирования
Извлечение конфигурации динамиков с помощью 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 );
Связанные разделы
-
Руководство по программированию XAudio2