commit 44cf9512745c3d766924fe86e2ccb1506d7b12a6 from: Omar Polo date: Fri Mar 25 11:56:26 2022 UTC handle flacs with bps != 16 and/or channels != 2 commit - 75da56db9b3ec4e213f7b279635feb44fda3cc29 commit + 44cf9512745c3d766924fe86e2ccb1506d7b12a6 blob - 13cfcb2a24ee1decf162ba0cff9233a17d5a9211 blob + 9797fa6bc37eff9a530011cc8ab392c41e11e5e3 --- player_flac.c +++ player_flac.c @@ -34,24 +34,43 @@ static FLAC__StreamDecoderWriteStatus writecb(const FLAC__StreamDecoder *decoder, const FLAC__Frame *frame, - const int32_t * const *buffer, void *data) + const int32_t * const *src, void *data) { static uint8_t buf[BUFSIZ]; - int i; + int c, i, bps, chans; size_t len; + bps = frame->header.bits_per_sample; + chans = frame->header.channels; + for (i = 0, len = 0; i < frame->header.blocksize; ++i) { - if (len+4 >= sizeof(buf)) { + if (len + 4*chan >= sizeof(buf)) { if (!play(buf, len)) goto quit; len = 0; } - buf[len++] = buffer[0][i] & 0xff; - buf[len++] = (buffer[0][i] >> 8) & 0xff; - - buf[len++] = buffer[1][i] & 0xff; - buf[len++] = (buffer[1][i] >> 8) & 0xff; + for (c = 0; c < chans; ++c) { + switch (bps) { + case 8: + buf[len++] = src[c][i] & 0xff; + break; + case 16: + buf[len++] = src[c][i] & 0xff; + buf[len++] = (src[c][i] >> 8) & 0xff; + break; + case 24: + case 32: + buf[len++] = src[c][i] & 0xff; + buf[len++] = (src[c][i] >> 8) & 0xff; + buf[len++] = (src[c][i] >> 16) & 0xff; + buf[len++] = (src[c][i] >> 24) & 0xff; + break; + default: + log_warnx("unsupported flac bps=%d", bps); + goto quit; + } + } } if (len != 0 && !play(buf, len)) @@ -67,13 +86,14 @@ metacb(const FLAC__StreamDecoder *decoder, const FLAC_ void *d) { uint32_t sample_rate; - int channels; + int channels, bits; if (meta->type == FLAC__METADATA_TYPE_STREAMINFO) { + bits = meta->data.stream_info.bits_per_sample; sample_rate = meta->data.stream_info.sample_rate; channels = meta->data.stream_info.channels; - if (player_setup(16, sample_rate, channels) == -1) + if (player_setup(bits, sample_rate, channels) == -1) err(1, "player_setrate"); } }