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


Практическое руководство. Сдвиг звука

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

Настройка сдвига

  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