25 bool convertTo16Bits =
true) {
26 is_convert_to_16 = convertTo16Bits;
27 max_block_size = maxBlockSize;
28 max_channels = maxChannels;
37 if (flac ==
nullptr) {
38 size_t foxen_size = fx_flac_size(max_block_size, max_channels);
40 foxen_data.resize(foxen_size);
42 if (foxen_data.data() !=
nullptr) {
43 flac = fx_flac_init(foxen_data.data(), max_block_size, max_channels);
46 if (flac !=
nullptr) {
49 LOGE(
"not enough memory");
50 if (is_stop_on_error)
stop();
52 if (buffer.size() == 0) {
53 buffer.resize(in_buffer_size);
54 out.resize(FOXEN_OUT_BUFFER_SIZE);
62 if (flac !=
nullptr) {
72 size_t write(
const uint8_t *data,
size_t len)
override {
73 LOGD(
"write: %d", len);
75 if (!is_active)
return 0;
78 LOGD(
"buffer availabe: %d", buffer.
available());
85 if (buffer.
available() == buffer.size()) {
86 LOGE(
"Decoder did not consume any data");
87 if (is_stop_on_error)
stop();
90 LOGD(
"write: %d -> %d", len, result);
94 void flush() { decode(); }
96 operator bool()
override {
return is_active; }
100 in_buffer_size = size;
105 out_buffer_size = size;
110 max_block_size = size;
120 is_convert_to_16 = !flag;
124 fx_flac_t *flac =
nullptr;
127 Vector<uint8_t> foxen_data{0};
128 bool is_active =
false;
129 bool is_convert_to_16 =
true;
130 bool is_stop_on_error =
true;
132 int max_block_size = 5 * 1024;
133 int max_channels = 2;
134 int in_buffer_size = FOXEN_IN_BUFFER_SIZE;
135 int out_buffer_size = FOXEN_OUT_BUFFER_SIZE;
139 if (flac ==
nullptr)
return false;
140 uint32_t out_len = out.size();
142 uint32_t buf_len_result = buf_len;
143 int rc = fx_flac_process(flac, buffer.
data(), &buf_len_result, out.data(),
148 case FLAC_END_OF_METADATA: {
153 LOGE(
"FLAC decoder in error state!");
154 if (is_stop_on_error)
stop();
159 LOGD(
"Providing data: %d samples", out_len);
160 if (is_convert_to_16) {
161 write16BitData(out_len);
163 write32BitData(out_len);
168 LOGD(
"processed: %d bytes of %d -> %d samples", buf_len_result, buf_len,
172 return buf_len_result > 0 || out_len > 0;
175 void write32BitData(
int out_len) {
178 writeBlocking(p_print, (uint8_t *)out.data(), out_len *
sizeof(int32_t));
181 void write16BitData(
int out_len) {
184 int16_t *out16 = (int16_t *)out.data();
185 for (
int j = 0; j < out_len; j++) {
186 out16[j] = out.data()[j] >> 16;
189 LOGI(
"writeBlocking: %d", out_len *
sizeof(int16_t));
190 writeBlocking(p_print, (uint8_t *)out.data(), out_len *
sizeof(int16_t));
193 void processMetadata() {
194 bits_eff = fx_flac_get_streaminfo(flac, FLAC_KEY_SAMPLE_SIZE);
195 int info_blocksize = fx_flac_get_streaminfo(flac, FLAC_KEY_MAX_BLOCK_SIZE);
197 LOGI(
"bits: %d", bits_eff);
198 LOGI(
"blocksize: %d", info_blocksize);
200 info.
sample_rate = fx_flac_get_streaminfo(flac, FLAC_KEY_SAMPLE_RATE);
201 info.
channels = fx_flac_get_streaminfo(flac, FLAC_KEY_N_CHANNELS);
205 LOGE(
"max channels too low: %d -> %d", max_channels, info.
channels);
206 if (is_stop_on_error)
stop();
208 if (info_blocksize > max_block_size) {
209 LOGE(
"max channels too low: %d -> %d", max_block_size, info_blocksize);
210 if (is_stop_on_error)
stop();
212 notifyAudioChange(info);