Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 8f122426 authored by Jean-Michel Trivi's avatar Jean-Michel Trivi Committed by Android (Google) Code Review
Browse files

Merge "MediaPlayer: fix channel mask handling" into tm-dev

parents 1333e712 275aa393
Loading
Loading
Loading
Loading
+21 −6
Original line number Diff line number Diff line
@@ -1946,12 +1946,27 @@ status_t NuPlayer::Renderer::onOpenAudioSink(
    int32_t numChannels;
    CHECK(format->findInt32("channel-count", &numChannels));

    int32_t rawChannelMask;
    audio_channel_mask_t channelMask =
            format->findInt32("channel-mask", &rawChannelMask) ?
                    static_cast<audio_channel_mask_t>(rawChannelMask)
                    // signal to the AudioSink to derive the mask from count.
                    : CHANNEL_MASK_USE_CHANNEL_ORDER;
    // channel mask info as read from the audio format
    int32_t channelMaskFromFormat;
    // channel mask to use for native playback
    audio_channel_mask_t channelMask;
    if (format->findInt32("channel-mask", &channelMaskFromFormat)) {
        // KEY_CHANNEL_MASK follows the android.media.AudioFormat java mask
        // which is left-bitshifted by 2 relative to the native mask
        if ((channelMaskFromFormat & 0b11) != 0) {
            // received an unexpected mask (supposed to follow AudioFormat constants
            // for output masks with the 2 least-significant bits at 0), but
            // it may come from an extractor that uses native masks: keeping
            // the mask as given is ok as it contains at least mono or stereo
            // and potentially the haptic channels
            channelMask = static_cast<audio_channel_mask_t>(channelMaskFromFormat);
        } else {
            channelMask = static_cast<audio_channel_mask_t>(channelMaskFromFormat >> 2);
        }
    } else {
        // no mask found: the mask will be derived from the channel count
        channelMask = CHANNEL_MASK_USE_CHANNEL_ORDER;
    }

    int32_t sampleRate;
    CHECK(format->findInt32("sample-rate", &sampleRate));