Поделиться через


Как панорамировать звук

В этом разделе показано, как настроить выходную матрицу моно исходного голоса, выводящегося в стерео-мастеринг, для достижения панорамы между левым и правым динамиками.

Настройка панорамирования

  1. Извлечение конфигурации динамиков с помощью IXAudio2MasteringVoice::GetChannelMask.

    DWORD dwChannelMask;       
    pMasteringVoice->GetChannelMask( &dwChannelMask );       
    
  2. Создайте массив для хранения выходной матрицы. Минимальный размер выходной матрицы — это количество каналов в исходном голосе, умноженное на количество каналов в выходном голосе. В этом случае восьмиэлементный массив будет передавать монофонический звук на любой формат вывода, включая пространственный звук 7.1.

    float outputMatrix[ 8 ];
    for (int i=0; i<8; i++) outputMatrix[i] = 0;
    
  3. Вычислите уровни отправки на основе требуемого сдвига между левыми и правыми динамиками. В этом примере значения панорамирования будут варьироваться от -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; 
    
  4. Задайте выходные индексы матрицы, соответствующие левым и правым динамикам, значениями, вычисляемыми на предыдущем шаге. Левый и правый динамики определяются по маске канала, возвращаемой 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;
    }
    
  5. Примените матрицу вывода к исходному голосу с помощью 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

Как построить простую схему обработки звука

Управление громкостью и высотой тона в XAudio2