mirror of
https://gitlab.freedesktop.org/pipewire/pipewire.git
synced 2025-10-31 22:25:38 -04:00
pw-cat: fix DSF playback again
Make the DSD buffers a little bigger because we scale down the rate. Read an interleaved number of samples to fill one quantum.
This commit is contained in:
parent
ebc775674a
commit
c48a4bc166
5 changed files with 15 additions and 5 deletions
|
|
@ -531,8 +531,8 @@ impl_node_port_enum_params(void *object, int seq,
|
|||
SPA_PARAM_BUFFERS_buffers, SPA_POD_CHOICE_RANGE_Int(2, 1, MAX_BUFFERS),
|
||||
SPA_PARAM_BUFFERS_blocks, SPA_POD_Int(this->blocks),
|
||||
SPA_PARAM_BUFFERS_size, SPA_POD_CHOICE_RANGE_Int(
|
||||
this->quantum_limit * this->frame_size,
|
||||
16 * this->frame_size,
|
||||
this->quantum_limit * this->frame_size * this->frame_scale,
|
||||
16 * this->frame_size * this->frame_scale,
|
||||
INT32_MAX),
|
||||
SPA_PARAM_BUFFERS_stride, SPA_POD_Int(this->frame_size));
|
||||
break;
|
||||
|
|
|
|||
|
|
@ -1235,7 +1235,7 @@ spa_alsa_enum_format(struct state *state, int seq, uint32_t start, uint32_t num,
|
|||
|
||||
int spa_alsa_set_format(struct state *state, struct spa_audio_info *fmt, uint32_t flags)
|
||||
{
|
||||
unsigned int rrate, rchannels, val;
|
||||
unsigned int rrate, rchannels, val, rscale = 1;
|
||||
snd_pcm_uframes_t period_size;
|
||||
int err, dir;
|
||||
snd_pcm_hw_params_t *params;
|
||||
|
|
@ -1322,21 +1322,26 @@ int spa_alsa_set_format(struct state *state, struct spa_audio_info *fmt, uint32_
|
|||
case 4:
|
||||
rformat = SND_PCM_FORMAT_DSD_U32_BE;
|
||||
rrate /= 4;
|
||||
rscale = 4;
|
||||
break;
|
||||
case -4:
|
||||
rformat = SND_PCM_FORMAT_DSD_U32_LE;
|
||||
rrate /= 4;
|
||||
rscale = 4;
|
||||
break;
|
||||
case 2:
|
||||
rformat = SND_PCM_FORMAT_DSD_U16_BE;
|
||||
rrate /= 2;
|
||||
rscale = 2;
|
||||
break;
|
||||
case -2:
|
||||
rformat = SND_PCM_FORMAT_DSD_U16_LE;
|
||||
rrate /= 2;
|
||||
rscale = 2;
|
||||
break;
|
||||
case 1:
|
||||
rformat = SND_PCM_FORMAT_DSD_U8;
|
||||
rscale = 1;
|
||||
break;
|
||||
default:
|
||||
return -ENOTSUP;
|
||||
|
|
@ -1430,6 +1435,7 @@ int spa_alsa_set_format(struct state *state, struct spa_audio_info *fmt, uint32_
|
|||
state->channels = rchannels;
|
||||
state->rate = rrate;
|
||||
state->frame_size = snd_pcm_format_physical_width(rformat) / 8;
|
||||
state->frame_scale = rscale;
|
||||
state->planar = planar;
|
||||
state->blocks = 1;
|
||||
if (planar)
|
||||
|
|
|
|||
|
|
@ -151,6 +151,7 @@ struct state {
|
|||
int rate;
|
||||
int channels;
|
||||
size_t frame_size;
|
||||
size_t frame_scale;
|
||||
int blocks;
|
||||
uint32_t rate_denom;
|
||||
uint32_t delay;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue