16#ifndef FLAC_READ_TIMEOUT_MS
17#define FLAC_READ_TIMEOUT_MS 10000
20#ifndef FLAC_BUFFER_SIZE
21#define FLAC_BUFFER_SIZE (8 * 1024)
65 if ((
decoder = FLAC__stream_decoder_new()) == NULL) {
66 LOGE(
"ERROR: allocating decoder");
70 LOGI(
"FLAC__stream_decoder_new");
74 auto state = FLAC__stream_decoder_get_state(
decoder);
75 if (state != FLAC__STREAM_DECODER_UNINITIALIZED){
76 FLAC__stream_decoder_finish(
decoder);
89 if (
init_status != FLAC__STREAM_DECODER_INIT_STATUS_OK) {
90 LOGE(
"ERROR: initializing decoder: %s", FLAC__StreamDecoderInitStatusString[
init_status]);
103 FLAC__stream_decoder_delete(
decoder);
111 while(FLAC__stream_decoder_process_single(
decoder));
122 LOGW(
"FLAC not active");
126 LOGE(
"setInput was not called");
129 if (!FLAC__stream_decoder_process_single(
decoder)) {
130 LOGE(
"FLAC__stream_decoder_process_single");
145 const char *
mime()
override {
return is_ogg ?
"audio/ogg; codecs=flac" :
"audio/flac"; }
164 FLAC__StreamDecoderErrorStatus status,
166 LOGE(FLAC__StreamDecoderErrorStatusString[status]);
174 static FLAC__StreamDecoderReadStatus
read_callback(
const FLAC__StreamDecoder *
decoder, FLAC__byte result_buffer[],
size_t *bytes,
void *client_data) {
175 FLAC__StreamDecoderReadStatus result = FLAC__STREAM_DECODER_READ_STATUS_CONTINUE;
176 LOGD(
"read_callback: %d", (
int) *bytes);
178 if (self ==
nullptr || !self->
is_active) {
179 return FLAC__STREAM_DECODER_READ_STATUS_ABORT;
183 *bytes = self->
readBytes(result_buffer, *bytes);
184 LOGD(
"-> %d", (
int) *bytes);
185 if (self->
isEof(*bytes)){
186 result = FLAC__STREAM_DECODER_READ_STATUS_END_OF_STREAM;
207 static FLAC__StreamDecoderWriteStatus
write_callback(
const FLAC__StreamDecoder *
decoder,
const FLAC__Frame *frame,
const FLAC__int32 *
const buffer[],
void *client_data) {
208 LOGD(
"write_callback: %u", (
unsigned)frame->header.blocksize);
212 if (self->
info != actual_info){
213 self->
info = actual_info;
215 int bps = FLAC__stream_decoder_get_bits_per_sample(
decoder);
217 LOGI(
"Converting from %d bits", bps);
219 self->
info = actual_info;
224 int bps = FLAC__stream_decoder_get_bits_per_sample(
decoder);
225 int16_t result_frame[actual_info.
channels];
229 for (
int j = 0; j < frame->header.blocksize; j++) {
230 for (
int i = 0; i < actual_info.
channels; i++) {
232 result_frame[i] = buffer[i][j]<<8;
234 self->
p_print->
write((uint8_t *)result_frame,
sizeof(result_frame));
238 for (
int j = 0; j < frame->header.blocksize; j++) {
239 for (
int i = 0; i < actual_info.
channels; i++) {
240 result_frame[i] = buffer[i][j];
242 self->
p_print->
write((uint8_t *)result_frame,
sizeof(result_frame));
246 for (
int j = 0; j < frame->header.blocksize; j++) {
247 for (
int i = 0; i < actual_info.
channels; i++) {
248 result_frame[i] = buffer[i][j] >> 8;
250 self->
p_print->
write((uint8_t *)result_frame,
sizeof(result_frame));
254 for (
int j = 0; j < frame->header.blocksize; j++) {
255 for (
int i = 0; i < actual_info.
channels; i++) {
256 result_frame[i] = buffer[i][j] >> 16;
258 self->
p_print->
write((uint8_t *)result_frame,
sizeof(result_frame));
262 LOGE(
"Unsupported bps: %d", bps);
265 return FLAC__STREAM_DECODER_WRITE_STATUS_CONTINUE;
309 const char *
mime()
override {
return "audio/flac"; }
323 LOGE(
"FLAC__stream_encoder_new");
337 FLAC__StreamEncoderInitStatus status;
339 status = FLAC__stream_encoder_init_ogg_stream(
p_encoder,
nullptr,
write_callback,
nullptr,
nullptr,
nullptr,
this);
343 if (status != FLAC__STREAM_ENCODER_INIT_STATUS_OK) {
344 LOGE(
"ERROR: initializing decoder: %s", FLAC__StreamEncoderInitStatusString[status]);
345 if (status==FLAC__STREAM_ENCODER_INIT_STATUS_ENCODER_ERROR){
346 LOGE(
" -> %s", FLAC__StreamEncoderStateString[FLAC__stream_encoder_get_state(
p_encoder)]);
371 virtual size_t write(
const uint8_t *data,
size_t len)
override {
373 LOGD(
"write: %zu", len);
377 int32_t *data32=
nullptr;
380 samples = len /
sizeof(int16_t);
388 samples = len /
sizeof(int32_t);
390 data32 = (int32_t*) data;
399 if (FLAC__stream_encoder_process_interleaved(
p_encoder, data32, frames)){
402 LOGE(
"FLAC__stream_encoder_process_interleaved");
423 static FLAC__StreamEncoderWriteStatus
write_callback(
const FLAC__StreamEncoder *encoder,
const FLAC__byte
buffer[],
size_t bytes, uint32_t samples, uint32_t current_frame,
void *client_data){
428 LOGE(
"write_callback %zu -> %zu", bytes, written);
429 return FLAC__STREAM_ENCODER_WRITE_STATUS_FATAL_ERROR;
432 return FLAC__STREAM_ENCODER_WRITE_STATUS_OK;
437 for (
int j=0;j<samples;j++){
#define LOGW(...)
Definition AudioLoggerIDF.h:29
#define TRACEI()
Definition AudioLoggerIDF.h:32
#define TRACED()
Definition AudioLoggerIDF.h:31
#define LOGI(...)
Definition AudioLoggerIDF.h:28
#define LOGD(...)
Definition AudioLoggerIDF.h:27
#define LOGE(...)
Definition AudioLoggerIDF.h:30
#define FLAC_READ_TIMEOUT_MS
Definition CodecFLAC.h:17
virtual size_t write(const uint8_t *data, size_t len)
Definition Arduino.h:120
virtual size_t readBytes(uint8_t *data, size_t len)
Definition Arduino.h:140