diff options
| author | trialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38> | 2008-07-20 20:38:44 +0000 |
|---|---|---|
| committer | trialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38> | 2008-07-20 20:38:44 +0000 |
| commit | bfbf64f8de94884be422e03ebeeb3d74315b7c5a (patch) | |
| tree | 1eeacc0dc51d03a35417de245ceaeee699fde1ab /src/plugins/Output/alsa/outputalsa.cpp | |
| parent | 6963d98b9619bf1aa930f2f15d8c431ff743816f (diff) | |
| download | qmmp-bfbf64f8de94884be422e03ebeeb3d74315b7c5a.tar.gz qmmp-bfbf64f8de94884be422e03ebeeb3d74315b7c5a.tar.bz2 qmmp-bfbf64f8de94884be422e03ebeeb3d74315b7c5a.zip | |
24-bit support
git-svn-id: http://svn.code.sf.net/p/qmmp-dev/code/trunk/qmmp@460 90c681e8-e032-0410-971d-27865f9a5e38
Diffstat (limited to 'src/plugins/Output/alsa/outputalsa.cpp')
| -rw-r--r-- | src/plugins/Output/alsa/outputalsa.cpp | 56 |
1 files changed, 37 insertions, 19 deletions
diff --git a/src/plugins/Output/alsa/outputalsa.cpp b/src/plugins/Output/alsa/outputalsa.cpp index 9d7eb5b0a..c2a8b9595 100644 --- a/src/plugins/Output/alsa/outputalsa.cpp +++ b/src/plugins/Output/alsa/outputalsa.cpp @@ -141,8 +141,26 @@ void OutputALSA::configure(long freq, int chan, int prec, int brate) return; } } - //TODO set format according prec value - if ((err = snd_pcm_hw_params_set_format(pcm_handle, hwparams, SND_PCM_FORMAT_S16_LE)) < 0) + snd_pcm_format_t format = SND_PCM_FORMAT_UNKNOWN; + switch (prec) + { + case 8: + format = SND_PCM_FORMAT_S8; + break; + case 16: + format = SND_PCM_FORMAT_S16_LE; + break; + case 24: + format = SND_PCM_FORMAT_S24_LE; + break; + case 32: + format = SND_PCM_FORMAT_S32_LE; + break; + default: + qWarning("OutputALSA: unsupported format detected"); + return; + } + if ((err = snd_pcm_hw_params_set_format(pcm_handle, hwparams, format)) < 0) { qDebug("OutputALSA: Error setting format: %s", snd_strerror(err)); return; @@ -198,7 +216,7 @@ void OutputALSA::configure(long freq, int chan, int prec, int brate) snd_pcm_sw_params_alloca(&swparams); snd_pcm_sw_params_current(pcm_handle, swparams); if ((err = snd_pcm_sw_params_set_start_threshold(pcm_handle, swparams, - buffer_size - period_size)) < 0) + buffer_size - period_size)) < 0) qWarning("OutputALSA: Error setting threshold: %s", snd_strerror(err)); if ((err = snd_pcm_sw_params(pcm_handle, swparams)) < 0) { @@ -206,7 +224,7 @@ void OutputALSA::configure(long freq, int chan, int prec, int brate) return; } //setup needed values - m_bits_per_frame = snd_pcm_format_physical_width(SND_PCM_FORMAT_S16_LE) * chan; + m_bits_per_frame = snd_pcm_format_physical_width(format) * chan; m_chunk_size = period_size; } } @@ -287,10 +305,10 @@ void OutputALSA::run() long m = 0; snd_pcm_uframes_t l; - long prebuffer_max_size = Buffer::size() + m_bits_per_frame * m_chunk_size / 8; + long prebuffer_size = Buffer::size() + m_bits_per_frame * m_chunk_size / 8; - unsigned char *prebuffer = (unsigned uchar *)malloc(prebuffer_max_size); - ulong prebuffer_size = 0; + unsigned char *prebuffer = (unsigned uchar *)malloc(prebuffer_size); + ulong prebuffer_fill = 0; dispatch(OutputState::Playing); @@ -323,17 +341,17 @@ void OutputALSA::run() if (b) { - if ((ulong)prebuffer_max_size < prebuffer_size + b->nbytes) + if ((ulong)prebuffer_size < prebuffer_fill + b->nbytes) { - prebuffer_max_size = prebuffer_size + b->nbytes; - prebuffer = (unsigned char*) realloc(prebuffer, prebuffer_max_size); + prebuffer_size = prebuffer_fill + b->nbytes; + prebuffer = (unsigned char*) realloc(prebuffer, prebuffer_size); } - memcpy(prebuffer + prebuffer_size, b->data, b->nbytes); - prebuffer_size += b->nbytes; + memcpy(prebuffer + prebuffer_fill, b->data, b->nbytes); + prebuffer_fill += b->nbytes; - l = snd_pcm_bytes_to_frames(pcm_handle, prebuffer_size); + l = snd_pcm_bytes_to_frames(pcm_handle, prebuffer_fill); while (l >= m_chunk_size) { @@ -342,8 +360,8 @@ void OutputALSA::run() { l -= m; m = snd_pcm_frames_to_bytes(pcm_handle, m); // convert frames to bytes - prebuffer_size -= m; - memcpy(prebuffer, prebuffer + m, prebuffer_size); //move data to begin + prebuffer_fill -= m; + memcpy(prebuffer, prebuffer + m, prebuffer_fill); //move data to begin m_totalWritten += m; status(); dispatchVisual(b, m_totalWritten, m_channels, m_precision); @@ -362,9 +380,9 @@ void OutputALSA::run() mutex()->lock (); //write remaining data - if (prebuffer_size > 0 && recycler()->empty()) + if (prebuffer_fill > 0 && recycler()->empty()) { - l = snd_pcm_bytes_to_frames(pcm_handle, prebuffer_size); + l = snd_pcm_bytes_to_frames(pcm_handle, prebuffer_fill); while (l > 0) { @@ -372,8 +390,8 @@ void OutputALSA::run() { l -= m; m = snd_pcm_frames_to_bytes(pcm_handle, m); // convert frames to bytes - prebuffer_size -= m; - memcpy(prebuffer, prebuffer + m, prebuffer_size); + prebuffer_fill -= m; + memcpy(prebuffer, prebuffer + m, prebuffer_fill); m_totalWritten += m; status(); } |
