Ticket #6279: softvol-trunk-4.patch

File softvol-trunk-4.patch, 11.9 KB (added by foobum@…, 12 years ago)
  • mythtv/libs/libavcodec/dca.c

    diff --git a/mythtv/libs/libavcodec/dca.c b/mythtv/libs/libavcodec/dca.c
    index a04e29d..2d78d2c 100644
    a b static int dca_decode_frame(AVCodecContext * avctx, 
    11431143    int16_t *samples = data;
    11441144    DCAContext *s = avctx->priv_data;
    11451145    int channels;
    1146 
     1146    int16_t tmp;
    11471147
    11481148    s->dca_buffer_size = dca_convert_bitstream(buf, buf_size, s->dca_buffer, DCA_MAX_FRAME_SIZE);
    11491149    if (s->dca_buffer_size == -1) {
    static int dca_decode_frame(AVCodecContext * avctx, 
    11841184        samples += 256 * channels;
    11851185    }
    11861186
     1187    if (channels == 6) {
     1188        for (i = 0; i < *data_size / sizeof(int16_t); i += channels) {
     1189            tmp = samples[i];
     1190            samples[i] = samples[i+1];
     1191            samples[i+1] = tmp;
     1192        }
     1193    }
     1194
    11871195    return buf_size;
    11881196}
    11891197
  • mythtv/libs/libmyth/audiooutputalsa.cpp

    diff --git a/mythtv/libs/libmyth/audiooutputalsa.cpp b/mythtv/libs/libmyth/audiooutputalsa.cpp
    index 1a66dfe..cce3258 100644
    a b void AudioOutputALSA::SetupMixer(void) 
    699699    if (mixer_handle != NULL)
    700700        CloseMixer();
    701701
     702    if (alsadevice.toLower() == "software")
     703        return;
     704
    702705    VERBOSE(VB_AUDIO, QString("Opening mixer %1").arg(device));
    703706
    704707    // TODO: This is opening card 0. Fix for case of multiple soundcards
  • mythtv/libs/libmyth/audiooutputbase.cpp

    diff --git a/mythtv/libs/libmyth/audiooutputbase.cpp b/mythtv/libs/libmyth/audiooutputbase.cpp
    index 112f554..9138f9d 100644
    a b AudioOutputBase::AudioOutputBase(const AudioSettings &settings) : 
    5353    needs_upmix(false),
    5454    surround_mode(FreeSurround::SurroundModePassive),
    5555    old_audio_stretchfactor(1.0),
     56    volume(80),
    5657
    5758    blocking(false),
    5859
    void AudioOutputBase::Reconfigure(const AudioSettings &orig_settings) 
    269270    if(audio_passthru || audio_enc)
    270271        // AC-3 output - soundcard expects a 2ch 48k stream
    271272        audio_channels = 2;
     273
     274    if (internal_vol && audio_enc && audio_reenc)
     275    {
     276        VERBOSE(VB_AUDIO, LOC + "Using software vol control for AC-3");
     277        SWVolume(true);
     278    }
     279    else
     280        SWVolume(false);
    272281   
    273282    audio_bytes_per_sample = audio_channels * audio_bits / 8;
    274283    source_audio_bytes_per_sample = source_audio_channels * audio_bits / 8;
    void AudioOutputBase::Reconfigure(const AudioSettings &orig_settings) 
    309318        VERBOSE(VB_AUDIO, "Aborting reconfigure");
    310319        return;
    311320    }
    312 
     321   
     322    // Only used for software volume
     323    if (set_initial_vol && internal_vol)
     324        volume = gContext->GetNumSetting("PCMMixerVolume", 100);
     325   
    313326    SyncVolume();
    314327
    315328    VERBOSE(VB_AUDIO, LOC + QString("Audio fragment size: %1")
    int AudioOutputBase::GetAudioBufferedTime(void) 
    600613     return audbuf_timecode - GetAudiotime();
    601614}
    602615
     616void AudioOutputBase::SetSWVolume(int new_volume, bool save)
     617{
     618    volume = new_volume;
     619    if (save)
     620    {
     621        QString controlLabel = gContext->GetSetting("MixerControl", "PCM");
     622        controlLabel += "MixerVolume";
     623        gContext->SaveSetting(controlLabel, volume);   
     624    }
     625}
     626
     627int AudioOutputBase::GetSWVolume()
     628{
     629    return volume;
     630}
     631
     632template <class AudioDataType>
     633void AudioOutputBase::_AdjustVolume(AudioDataType *buffer, int len, bool music)
     634{
     635    float g = volume / 100.0;
     636
     637    // Should probably be logarithmic - this'll do
     638    g *= g;
     639   
     640    // Add gain to AC-3 - try to ~ match PCM volume
     641    if (audio_enc && audio_reenc)
     642        g *= 1.8;
     643
     644    // Music is relatively loud - ditto
     645    else if (music)
     646        g *= 0.4;
     647
     648    if (g == 1.0)
     649        return;
     650
     651    for (int i = 0; i < (int)(len / sizeof(AudioDataType)); i++)
     652    {
     653        float s = static_cast<float>(buffer[i]) * g /
     654                  static_cast<float>(numeric_limits<AudioDataType>::max());
     655        if (s >= 1.0)
     656            buffer[i] = numeric_limits<AudioDataType>::max();
     657        else if (s <= -1.0)
     658            buffer[i] = numeric_limits<AudioDataType>::min();
     659        else
     660            buffer[i] = static_cast<AudioDataType>
     661                        (s * numeric_limits<AudioDataType>::max());
     662    }
     663}
     664
     665void AudioOutputBase::AdjustVolume(void *buffer, int len, bool music) {
     666
     667    if (audio_bits == 8)
     668        _AdjustVolume<char>((char *)buffer, len, music);
     669    else if (audio_bits == 16)
     670        _AdjustVolume<short>((short *)buffer, len, music);
     671
     672}
     673
     674
    603675bool AudioOutputBase::AddSamples(char *buffers[], int samples,
    604676                                 long long timecode)
    605677{
    void AudioOutputBase::_AddSamples(void *buffer, bool interleaved, int samples, 
    9431015       
    9441016    }
    9451017
     1018    if (internal_vol && SWVolume())
     1019    {
     1020        int bdiff = kAudioRingBufferSize - waud;
     1021        bool music = (timecode < 1);
     1022
     1023        if (bdiff < len)
     1024        {
     1025            AdjustVolume(audiobuffer + waud, bdiff, music);
     1026            AdjustVolume(audiobuffer, len - bdiff, music);
     1027        }
     1028        else
     1029            AdjustVolume(audiobuffer + waud, len, music);
     1030    }
     1031
    9461032    // Encode to AC-3?
    9471033    if (encoder)
    9481034    {
  • mythtv/libs/libmyth/audiooutputbase.h

    diff --git a/mythtv/libs/libmyth/audiooutputbase.h b/mythtv/libs/libmyth/audiooutputbase.h
    index 9a264a7..95634a4 100644
    a b class AudioOutputBase : public AudioOutput, public QThread 
    4747
    4848    virtual void Reset(void);
    4949
     50    void SetSWVolume(int new_volume, bool save);
     51    int GetSWVolume(void);
     52
    5053    // timecode is in milliseconds.
    5154    virtual bool AddSamples(char *buffer, int samples, long long timecode);
    5255    virtual bool AddSamples(char *buffers[], int samples, long long timecode);
    class AudioOutputBase : public AudioOutput, public QThread 
    150153    int src_quality;
    151154
    152155 private:
     156    // software volume
     157    template <class AudioDataType>
     158    void _AdjustVolume(AudioDataType *buffer, int len, bool music);
     159    void AdjustVolume(void *buffer, int len, bool music);
     160   
    153161    // resampler
    154162    bool need_resampler;
    155163    SRC_STATE *src_ctx;
    class AudioOutputBase : public AudioOutput, public QThread 
    166174    int surround_mode;
    167175    bool allow_ac3_passthru;
    168176    float old_audio_stretchfactor;
     177    int volume;
    169178
    170179    bool blocking; // do AddSamples calls block?
    171180
  • mythtv/libs/libmyth/audiooutputoss.cpp

    diff --git a/mythtv/libs/libmyth/audiooutputoss.cpp b/mythtv/libs/libmyth/audiooutputoss.cpp
    index a18f147..348a60f 100644
    a b void AudioOutputOSS::VolumeInit() 
    287287    int volume = 0;
    288288
    289289    QString device = gContext->GetSetting("MixerDevice", "/dev/mixer");
     290    if (device.toLower() == "software")
     291        return;
    290292    QByteArray dev = device.toAscii();
    291293    mixerfd = open(dev.constData(), O_RDONLY);
    292294
  • mythtv/libs/libmyth/volumebase.cpp

    diff --git a/mythtv/libs/libmyth/volumebase.cpp b/mythtv/libs/libmyth/volumebase.cpp
    index d1f1fb0..a6d053a 100644
    a b VolumeBase::VolumeBase() : 
    1010    internal_vol(false), volume(80),
    1111    current_mute_state(kMuteOff)
    1212{
     13    swvol = swvol_setting =
     14      (gContext->GetSetting("MixerDevice", "default").toLower() == "software");
     15}
     16
     17bool VolumeBase::SWVolume(void)
     18{
     19    return swvol;
     20}
     21
     22void VolumeBase::SWVolume(bool set)
     23{
     24    if (swvol_setting)
     25        return;
     26    swvol = set;
    1327}
    1428
    1529uint VolumeBase::GetCurrentVolume(void) const
    MuteState VolumeBase::NextMuteState(MuteState cur) 
    7690void VolumeBase::UpdateVolume(void)
    7791{
    7892    int new_volume = volume;
     93    bool save = true;
    7994    if (current_mute_state == kMuteAll)
    8095    {
    8196        new_volume = 0;
     97        save = false;
     98    }
     99
     100    if (swvol)
     101    {
     102        SetSWVolume(new_volume, save);
     103        return;
    82104    }
    83105   
    84106    // TODO: Avoid assumption that there are 2 channels!
    void VolumeBase::UpdateVolume(void) 
    102124void VolumeBase::SyncVolume(void)
    103125{
    104126    // Read the volume from the audio driver and setup our internal state to match
    105     volume = GetVolumeChannel(0);
     127    if (swvol)
     128        volume = GetSWVolume();
     129    else
     130        volume = GetVolumeChannel(0);
    106131}
    107132
  • mythtv/libs/libmyth/volumebase.h

    diff --git a/mythtv/libs/libmyth/volumebase.h b/mythtv/libs/libmyth/volumebase.h
    index 4257f0b..68fb6f1 100644
    a b class MPUBLIC VolumeBase 
    2020    VolumeBase();   
    2121    virtual ~VolumeBase() {};
    2222
     23    void SWVolume(bool set);
     24    bool SWVolume(void);
    2325    virtual uint GetCurrentVolume(void) const;
    2426    virtual void SetCurrentVolume(int value);
    2527    virtual void AdjustCurrentVolume(int change);
    class MPUBLIC VolumeBase 
    3436
    3537    virtual int GetVolumeChannel(int channel) const = 0; // Returns 0-100
    3638    virtual void SetVolumeChannel(int channel, int volume) = 0; // range 0-100 for vol
     39    virtual void SetSWVolume(int new_volume, bool save) = 0;
     40    virtual int GetSWVolume(void) = 0;
    3741
    3842    void UpdateVolume(void);
    3943    void SyncVolume(void);
    class MPUBLIC VolumeBase 
    4448   
    4549    int volume;
    4650    MuteState current_mute_state;
     51    bool swvol;
     52    bool swvol_setting;
    4753
    4854};
    4955
  • mythtv/libs/libmythtv/avformatdecoder.cpp

    diff --git a/mythtv/libs/libmythtv/avformatdecoder.cpp b/mythtv/libs/libmythtv/avformatdecoder.cpp
    index 50c2919..e963be9 100644
    a b AvFormatDecoder::AvFormatDecoder(NuppelVideoPlayer *parent, 
    427427      // Audio
    428428      audioSamples(NULL),
    429429      allow_ac3_passthru(false),    allow_dts_passthru(false),
     430      internal_vol(false),
    430431      disable_passthru(false),      max_channels(2),
    431432      last_ac3_channels(0),         dummy_frame(NULL),
    432433      // DVD
    AvFormatDecoder::AvFormatDecoder(NuppelVideoPlayer *parent, 
    448449
    449450    allow_ac3_passthru = gContext->GetNumSetting("AC3PassThru", false);
    450451    allow_dts_passthru = gContext->GetNumSetting("DTSPassThru", false);
     452    internal_vol = gContext->GetNumSetting("MythControlsVolume", 0);
    451453    max_channels = (uint) gContext->GetNumSetting("MaxChannels", 2);
    452454
    453455    audioIn.sample_size = -32; // force SetupAudioStream to run once
    bool AvFormatDecoder::DoPassThrough(const AVCodecContext *ctx) 
    41294131
    41304132    if (ctx->codec_id == CODEC_ID_AC3)
    41314133        passthru = allow_ac3_passthru &&
    4132                    ctx->channels >= (int)max_channels;
     4134                   ctx->channels >= (int)max_channels &&
     4135                   !internal_vol;
    41334136    else if (ctx->codec_id == CODEC_ID_DTS)
    4134         passthru = allow_dts_passthru;
     4137        passthru = allow_dts_passthru && !internal_vol;
    41354138   
    41364139    passthru &= !transcoding && !disable_passthru;
    41374140    // Don't know any cards that support spdif clocked at < 44100
  • mythtv/libs/libmythtv/avformatdecoder.h

    diff --git a/mythtv/libs/libmythtv/avformatdecoder.h b/mythtv/libs/libmythtv/avformatdecoder.h
    index 57311b6..fb9cfe7 100644
    a b class AvFormatDecoder : public DecoderBase 
    269269    short int        *audioSamples;
    270270    bool              allow_ac3_passthru;
    271271    bool              allow_dts_passthru;
     272    bool              internal_vol;
    272273    bool              disable_passthru;
    273274    uint              max_channels;
    274275    uint              last_ac3_channels;
  • mythtv/programs/mythtranscode/transcode.cpp

    diff --git a/mythtv/programs/mythtranscode/transcode.cpp b/mythtv/programs/mythtranscode/transcode.cpp
    index f3b7f04..fe80532 100644
    a b class AudioReencodeBuffer : public AudioOutput 
    227227        // Do nothing
    228228        return false;
    229229    }
     230    virtual void SetSWVolume(int new_volume, bool save)
     231    {
     232        // Do nothing
     233        return;
     234    }
     235   
     236    virtual int GetSWVolume(void)
     237    {
     238        // Do nothing
     239        return 100;
     240    }
    230241
    231242    //  These are pure virtual in AudioOutput, but we don't need them here
    232243    virtual void bufferOutputData(bool){ return; }