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

Commit de5e5d71 authored by Phil Burk's avatar Phil Burk Committed by Android (Google) Code Review
Browse files

Merge "AudioFlinger: more DTS passthrough support"

parents 7d014e50 23d8997f
Loading
Loading
Loading
Loading
+14 −11
Original line number Diff line number Diff line
@@ -44,7 +44,7 @@ status_t AudioHwDevice::openOutputStream(
    AudioStreamOut *outputStream = new AudioStreamOut(this, flags);

    // Try to open the HAL first using the current format.
    ALOGV("AudioHwDevice::openOutputStream(), try "
    ALOGV("openOutputStream(), try "
            " sampleRate %d, Format %#x, "
            "channelMask %#x",
            config->sample_rate,
@@ -59,7 +59,7 @@ status_t AudioHwDevice::openOutputStream(
        // FIXME Look at any modification to the config.
        // The HAL might modify the config to suggest a wrapped format.
        // Log this so we can see what the HALs are doing.
        ALOGI("AudioHwDevice::openOutputStream(), HAL returned"
        ALOGI("openOutputStream(), HAL returned"
            " sampleRate %d, Format %#x, "
            "channelMask %#x, status %d",
            config->sample_rate,
@@ -72,17 +72,20 @@ status_t AudioHwDevice::openOutputStream(
                && ((flags & AUDIO_OUTPUT_FLAG_DIRECT) != 0)
                && ((flags & AUDIO_OUTPUT_FLAG_COMPRESS_OFFLOAD) == 0);

        // FIXME - Add isEncodingSupported() query to SPDIF wrapper then
        // call it from here.
        if (wrapperNeeded) {
            outputStream = new SpdifStreamOut(this, flags);
            if (SPDIFEncoder::isFormatSupported(originalConfig.format)) {
                outputStream = new SpdifStreamOut(this, flags, originalConfig.format);
                status = outputStream->open(handle, devices, &originalConfig, address);
                if (status != NO_ERROR) {
                ALOGE("ERROR - AudioHwDevice::openOutputStream(), SPDIF open returned %d",
                    ALOGE("ERROR - openOutputStream(), SPDIF open returned %d",
                        status);
                    delete outputStream;
                    outputStream = NULL;
                }
            } else {
                ALOGE("ERROR - openOutputStream(), SPDIFEncoder does not support format 0x%08x",
                    originalConfig.format);
            }
        }
    }

+10 −5
Original line number Diff line number Diff line
@@ -32,10 +32,12 @@ namespace android {
 * If the AudioFlinger is processing encoded data and the HAL expects
 * PCM then we need to wrap the data in an SPDIF wrapper.
 */
SpdifStreamOut::SpdifStreamOut(AudioHwDevice *dev, audio_output_flags_t flags)
SpdifStreamOut::SpdifStreamOut(AudioHwDevice *dev,
            audio_output_flags_t flags,
            audio_format_t format)
        : AudioStreamOut(dev,flags)
        , mRateMultiplier(1)
        , mSpdifEncoder(this)
        , mSpdifEncoder(this, format)
        , mRenderPositionHal(0)
        , mPreviousHalPosition32(0)
{
@@ -49,15 +51,15 @@ status_t SpdifStreamOut::open(
{
    struct audio_config customConfig = *config;

    customConfig.format = AUDIO_FORMAT_PCM_16_BIT;
    customConfig.channel_mask = AUDIO_CHANNEL_OUT_STEREO;

    // Some data bursts run at a higher sample rate.
    // TODO Move this into the audio_utils as a static method.
    switch(config->format) {
        case AUDIO_FORMAT_E_AC3:
            mRateMultiplier = 4;
            break;
        case AUDIO_FORMAT_AC3:
        case AUDIO_FORMAT_DTS:
        case AUDIO_FORMAT_DTS_HD:
            mRateMultiplier = 1;
            break;
        default:
@@ -67,6 +69,9 @@ status_t SpdifStreamOut::open(
    }
    customConfig.sample_rate = config->sample_rate * mRateMultiplier;

    customConfig.format = AUDIO_FORMAT_PCM_16_BIT;
    customConfig.channel_mask = AUDIO_CHANNEL_OUT_STEREO;

    // Always print this because otherwise it could be very confusing if the
    // HAL and AudioFlinger are using different formats.
    // Print before open() because HAL may modify customConfig.
+5 −3
Original line number Diff line number Diff line
@@ -38,7 +38,8 @@ namespace android {
class SpdifStreamOut : public AudioStreamOut {
public:

    SpdifStreamOut(AudioHwDevice *dev, audio_output_flags_t flags);
    SpdifStreamOut(AudioHwDevice *dev, audio_output_flags_t flags,
            audio_format_t format);

    virtual ~SpdifStreamOut() { }

@@ -77,8 +78,9 @@ private:
    class MySPDIFEncoder : public SPDIFEncoder
    {
    public:
        MySPDIFEncoder(SpdifStreamOut *spdifStreamOut)
          : mSpdifStreamOut(spdifStreamOut)
        MySPDIFEncoder(SpdifStreamOut *spdifStreamOut, audio_format_t format)
          :  SPDIFEncoder(format)
          , mSpdifStreamOut(spdifStreamOut)
        {
        }