Ticket #8408: mythtv_lpcm.patch

File mythtv_lpcm.patch, 6.8 KB (added by anonymous, 10 years ago)
  • libs/libmyth/audiooutputalsa.cpp

    diff -u -r ./libs/libmyth/audiooutputalsa.cpp /home/anonymous/work/mythtv-0.23.0+fixes24291/libs/libmyth/audiooutputalsa.cpp
    old new  
    232232#else
    233233        format = SND_PCM_FORMAT_S24_LE;
    234234#endif
     235    else if (audio_bits == 32)
     236#ifdef WORDS_BIGENDIAN
     237        format = SND_PCM_FORMAT_S32;
     238#else
     239        format = SND_PCM_FORMAT_S32_LE;
     240#endif
    235241    else
    236242    {
    237243        Error(QString("Unknown sample format: %1 bits.").arg(audio_bits));
     
    275281        _ReorderSmpteToAlsa6ch((unsigned char *)buf, frames);
    276282    else if (audio_bits == 16)
    277283        _ReorderSmpteToAlsa6ch((short *)buf, frames);
     284    else if (audio_bits == 32)
     285        _ReorderSmpteToAlsa6ch((int *)buf, frames);
    278286}
    279287
    280288template <class AudioDataType>
  • libs/libmyth/audiooutputbase.cpp

    diff -u -r ./libs/libmyth/audiooutputbase.cpp /home/anonymous/work/mythtv-0.23.0+fixes24291/libs/libmyth/audiooutputbase.cpp
    old new  
    265265    audio_passthru = settings.use_passthru;
    266266    needs_upmix = lneeds_upmix;
    267267
    268     if (audio_bits != 8 && audio_bits != 16)
     268    if (audio_bits != 8 && audio_bits != 16 && audio_bits != 32)
    269269    {
    270         Error("AudioOutput only supports 8 or 16bit audio.");
     270        Error("AudioOutput only supports 8 or 16 or 32bit audio.");
    271271        return;
    272272    }
    273273
     
    284284
    285285    // Encode to AC-3 if not passing thru , there's > 2 channels
    286286    // and a passthru device is defined
    287     if (!audio_passthru && allow_ac3_passthru &&
    288         (audio_channels > 2 || audio_reenc))
    289         audio_enc = true;
     287    // if (!audio_passthru && allow_ac3_passthru &&
     288    //     (audio_channels > 2 || audio_reenc))
     289    //     audio_enc = true;
    290290
    291291    // Find out what sample rates we can output (if output layer supports it)
    292292    vector<int> rates = GetSupportedRates();
     
    701701        _AdjustVolume<char>((char *)buffer, len, music);
    702702    else if (audio_bits == 16)
    703703        _AdjustVolume<short>((short *)buffer, len, music);
     704    else if (audio_bits == 32)
     705        _AdjustVolume<int>((int *)buffer, len, music);
    704706}
    705707
    706708template <class AudioDataType>
     
    921923        return _MonoToStereo((unsigned char *)s1, (unsigned char *)s2, samples);
    922924    else if (audio_bits == 16)
    923925        return _MonoToStereo((short *)s1, (short *)s2, samples);
     926    else if (audio_bits == 32)
     927        return _MonoToStereo((int *)s1, (int *)s2, samples);
    924928    else
    925929        return NULL; // 0
    926930}
     
    10581062                    audiobuffer[org_waud++] = mybuf[chan][itemp];
    10591063                    if (audio_bits == 16)
    10601064                        audiobuffer[org_waud++] = mybuf[chan][itemp+1];
    1061 
     1065                    if (audio_bits == 32) {
     1066                        audiobuffer[org_waud++] = mybuf[chan][itemp+1];
     1067                        audiobuffer[org_waud++] = mybuf[chan][itemp+2];
     1068                        audiobuffer[org_waud++] = mybuf[chan][itemp+3];
     1069                    }
    10621070                    org_waud %= kAudioRingBufferSize;
    10631071                }
    10641072            }
     
    13931401            buffer[i + offset_dst] = buffer[i + offset_src];
    13941402            if (audio_bits == 16)
    13951403                buffer[i + offset_dst + 1] = buffer[i + offset_src + 1];
     1404            if (audio_bits == 32) {
     1405                buffer[i + offset_dst + 1] = buffer[i + offset_src + 1];
     1406                buffer[i + offset_dst + 2] = buffer[i + offset_src + 2];
     1407                buffer[i + offset_dst + 3] = buffer[i + offset_src + 3];
     1408            }
    13961409        }
    13971410    }
    13981411
  • libs/libmythtv/avformatdecoder.cpp

    diff -u -r ./libs/libmythtv/avformatdecoder.cpp /home/anonymous/work/mythtv-0.23.0+fixes24291/libs/libmythtv/avformatdecoder.cpp
    old new  
    34373437        {
    34383438            vector<int> flang = filter_lang(atracks, *it);
    34393439
    3440             if (allow_dts_passthru && !transcoding)
     3440            if (selTrack < 0)
     3441                selTrack = filter_max_ch(ic, atracks, flang, CODEC_ID_FLAC);
     3442
     3443            if (selTrack < 0)
     3444                selTrack = filter_max_ch(ic, atracks, flang, CODEC_ID_TRUEHD);
     3445
     3446            if (selTrack < 0 && allow_dts_passthru && !transcoding)
    34413447                selTrack = filter_max_ch(ic, atracks, flang, CODEC_ID_DTS);
    34423448
    34433449            if (selTrack < 0)
     
    34523458            VERBOSE(VB_AUDIO, LOC + "Trying to select audio track (wo/lang)");
    34533459            vector<int> flang = filter_lang(atracks, -1);
    34543460
    3455             if (allow_dts_passthru && !transcoding)
     3461            if (selTrack < 0)
     3462                selTrack = filter_max_ch(ic, atracks, flang, CODEC_ID_FLAC);
     3463
     3464            if (selTrack < 0)
     3465                selTrack = filter_max_ch(ic, atracks, flang, CODEC_ID_TRUEHD);
     3466
     3467            if (selTrack < 0 && allow_dts_passthru && !transcoding)
    34563468                selTrack = filter_max_ch(ic, atracks, flang, CODEC_ID_DTS);
    34573469
    34583470            if (selTrack < 0)
     
    40924104                        }
    40934105
    40944106                            // Convert sample format if required (Myth only handles 8 and 16 bits audio)
    4095                         if (ctx->sample_fmt != SAMPLE_FMT_S16 && ctx->sample_fmt != SAMPLE_FMT_U8)
     4107                        if (false && ctx->sample_fmt != SAMPLE_FMT_S16 && ctx->sample_fmt != SAMPLE_FMT_U8)
    40964108                        {
    40974109                            if (audio_src_fmt != ctx->sample_fmt)
    40984110                            {
     
    46534665        if (codec_ctx)
    46544666        {
    46554667            using_passthru = DoPassThrough(codec_ctx);
    4656             info = AudioInfo(codec_ctx->codec_id, codec_ctx->sample_rate,
    4657                             codec_ctx->channels, using_passthru);
     4668            info = AudioInfo(codec_ctx->codec_id, codec_ctx->channels *
     4669                             av_get_bits_per_sample_format(codec_ctx->sample_fmt) / 8,
     4670                             codec_ctx->sample_rate, codec_ctx->channels, using_passthru);
    46584671        }
    46594672    }
    46604673
  • libs/libmythtv/avformatdecoder.h

    diff -u -r ./libs/libmythtv/avformatdecoder.h /home/anonymous/work/mythtv-0.23.0+fixes24291/libs/libmythtv/avformatdecoder.h
    old new  
    3939        channels(-1), do_passthru(false)
    4040    {;}
    4141
    42     AudioInfo(CodecID id, int sr, int ch, bool passthru) :
    43         codec_id(id), sample_size(ch*2),   sample_rate(sr),
     42    AudioInfo(CodecID id, int sample_size, int sr, int ch, bool passthru) :
     43        codec_id(id), sample_size(sample_size),  sample_rate(sr),
    4444        channels(ch), do_passthru(passthru)
    4545    {;}
    4646