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:
Wim Taymans 2022-04-28 12:32:08 +02:00
parent ebc775674a
commit c48a4bc166
5 changed files with 15 additions and 5 deletions

View file

@ -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;

View file

@ -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)

View file

@ -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;

View file

@ -222,6 +222,8 @@ dsf_file_read(struct dsf_file *f, void *data, size_t samples, const struct dsf_l
offset = block * f->info.blocksize * f->info.channels;
pos = f->offset % f->info.blocksize;
samples *= step;
for (total = 0; total < samples && offset + pos < f->info.length; total++) {
const uint8_t *s = f->p + offset + pos;
uint32_t i;

View file

@ -709,10 +709,11 @@ on_param_changed(void *userdata, uint32_t id, const struct spa_pod *param)
data->stride = data->dsf.layout.channels * SPA_ABS(data->dsf.layout.interleave);
if (data->verbose) {
printf("DSD: channels:%d bitorder:%s interleave:%d\n",
printf("DSD: channels:%d bitorder:%s interleave:%d stride:%d\n",
data->dsf.layout.channels,
data->dsf.layout.lsb ? "lsb" : "msb",
data->dsf.layout.interleave);
data->dsf.layout.interleave,
data->stride);
}
}