Ticket #7555: 7555-win32_spdif.2.patch

File 7555-win32_spdif.2.patch, 3.4 KB (added by Jeff Lu <jll544@…>, 14 years ago)

Replaces original patch; adds GetSupportedRates?() for win32

  • libs/libmyth/audiooutputwin.cpp

     
    138138    }
    139139}
    140140
     141vector<int> AudioOutputWin::GetSupportedRates(void)
     142{
     143    // We use WAVE_MAPPER to find a compatible device,
     144    // so just return a set of standard rates
     145    const int srates[] = { 11025, 22050, 44100, 48000 };
     146    vector<int> rates(srates, srates + sizeof(srates) / sizeof(int) );
     147    return rates;
     148}
     149
    141150bool AudioOutputWin::OpenDevice(void)
    142151{
    143152    CloseDevice();
     
    145154    SetBlocking(true);
    146155    fragment_size = (AUDIOOUTPUT_TELEPHONY == source) ? 320 : 6144;
    147156    soundcard_buffer_size = kPacketCnt * fragment_size;
     157    m_UseSPDIF = audio_passthru || audio_enc;
    148158
    149159    WAVEFORMATEXTENSIBLE wf;
    150160    wf.Format.wFormatTag =
  • libs/libmyth/audiooutputwin.h

     
    2323    virtual void WriteAudio(unsigned char *aubuf, int size);
    2424    virtual int  GetSpaceOnSoundcard(void) const;
    2525    virtual int  GetBufferedOnSoundcard(void) const;
     26    vector<int> GetSupportedRates(void);
    2627
    2728  protected:
    2829    AudioOutputWinPrivate *m_priv;
  • libs/libmyth/audiooutputdx.cpp

     
    280280    }
    281281}
    282282
     283vector<int> AudioOutputDX::GetSupportedRates(void)
     284{
     285    const int srates[] = { 8000, 11025, 16000, 22050, 32000, 44100, 48000 };
     286    vector<int> rates(srates, srates + sizeof(srates) / sizeof(int) );
     287    DSCAPS devcaps;
     288    devcaps.dwSize = sizeof(DSCAPS);
     289
     290    if ((!m_priv->dsobject || !m_priv->dsound_dll) ||
     291        FAILED(IDirectSound_GetCaps(m_priv->dsobject, &devcaps)) )
     292    {
     293        rates.clear();
     294        return rates;
     295    }
     296
     297    VERBOSE(VB_AUDIO, QString(LOC + "GetCaps sample rate min: %1 max: %2")
     298                .arg(devcaps.dwMinSecondarySampleRate)
     299                .arg(devcaps.dwMaxSecondarySampleRate));
     300
     301    vector<int>::iterator it = rates.begin();
     302    while (it != rates.end())
     303    {
     304        if(((DWORD)*it < devcaps.dwMinSecondarySampleRate) ||
     305           ((DWORD)*it > devcaps.dwMaxSecondarySampleRate) )
     306            it = rates.erase(it);
     307        else
     308            it++;
     309    }
     310
     311    return rates;
     312}
     313
    283314bool AudioOutputDX::OpenDevice(void)
    284315{
    285316    WAVEFORMATEXTENSIBLE wf;
     
    299330        fragment_size *= 2;
    300331    soundcard_buffer_size = kFramesNum * fragment_size;
    301332    audio_bytes_per_sample = audio_bits / 8 * audio_channels;
     333    m_UseSPDIF = audio_passthru || audio_enc;
    302334    if (m_UseSPDIF && (audio_channels != 2))
    303335    {
    304336        Error("SPDIF passthru requires 2 channel data");
  • libs/libmyth/audiooutputdx.h

     
    2323    virtual void Pause(bool pause);
    2424    virtual int GetSpaceOnSoundcard(void) const;
    2525    virtual int GetBufferedOnSoundcard(void) const;   
     26    vector<int> GetSupportedRates(void);
    2627
    2728  protected:
    2829    AudioOutputDXPrivate    *m_priv;