5#include "AudioTools/AudioCodecs/AudioCodecsBase.h"
12 void setChannels(
int inNumChannels) {
13 int size = (inNumChannels > 2)
14 ?
sizeof(ALACSpecificConfig) + kChannelAtomSize +
15 sizeof(ALACAudioChannelLayout)
16 :
sizeof(ALACSpecificConfig);
20 uint32_t size() {
return vector.size(); }
21 uint8_t* data() {
return vector.data(); }
49 bool setCodecConfig(ALACSpecificConfig config) {
50 return setCodecConfig((uint8_t*)&config,
sizeof(config));
55 size_t result = setCodecConfig(cfg.data(), cfg.size());
62 LOGI(
"DecoderALAC::setCodecConfig: %d", (
int)len);
64 int32_t rc = dec.Init((
void*)data, len);
69 LOGI(
"ALAC Decoder Setup - SR: %d, Channels: %d, Bits: %d, Frame Size: %d",
70 (
int)dec.mConfig.sampleRate, (
int)dec.mConfig.numChannels,
71 (
int)dec.mConfig.bitDepth, (
int)dec.mConfig.frameLength);
74 tmp.
channels = dec.mConfig.numChannels;
85 dec.mConfig.numChannels = from.
channels;
91 size_t write(
const uint8_t* encodedFrame,
size_t encodedLen)
override {
92 LOGD(
"DecoderALAC::write: %d", (
int)encodedLen);
95 if (!is_init) setDefaultConfig();
103 BitBufferInit(&bits, (uint8_t*)encodedFrame, encodedLen);
106 uint32_t outNumSamples = 0;
108 dec.Decode(&bits, result_buffer.data(), dec.mConfig.frameLength,
109 dec.mConfig.numChannels, &outNumSamples);
112 LOGE(
"Decode failed with error: %d", status);
118 outNumSamples * dec.mConfig.numChannels * dec.mConfig.bitDepth / 8;
119 LOGI(
"DecoderALAC::write-pcm: %d", (
int)outputSize);
122 int open = outputSize;
125 int writeSize = MIN(1024, open);
127 p_print->write(result_buffer.data() + processed, writeSize);
128 if (writeSize != written) {
129 LOGE(
"write error: %d -> %d", (
int)outputSize, (
int)written);
132 processed += written;
91 size_t write(
const uint8_t* encodedFrame,
size_t encodedLen)
override {
…}
137 operator bool() {
return true; }
149 bool is_init =
false;
150 struct BitBuffer bits;
152 void setDefaultConfig() {
155 ALACSpecificConfig tmp;
158 tmp.compatibleVersion = 0;
174 uint32_t uncompressedFrameSize =
182 uncompressedFrameSize + (uncompressedFrameSize / 2) + 64 + 50;
190 return dec.mConfig.frameLength * dec.mConfig.numChannels *
191 dec.mConfig.bitDepth / 8;
196 config.frameLength = Swap32NtoB(config.frameLength);
197 config.maxRun = Swap16NtoB((uint16_t)config.maxRun);
198 config.maxFrameBytes = Swap32NtoB(config.maxFrameBytes);
199 config.avgBitRate = Swap32NtoB(config.avgBitRate);
200 config.sampleRate = Swap32NtoB(config.sampleRate);
217 void setOutput(
Print& out_stream)
override { p_print = &out_stream; };
219 bool begin()
override {
220 if (p_print ==
nullptr) {
221 LOGE(
"No output stream set");
225 input_format = getInputFormat();
226 out_format = getOutputFormat();
229 enc.SetFrameSize(frame_size);
230 int rc = enc.InitializeEncoder(out_format);
234 uint32_t inputBufferSize = frame_size * info.
channels * bytesPerSample;
236 uint32_t outputBufferSize = inputBufferSize * 2;
239 "ALAC Encoder: frame_size=%d, inputBuf=%d, outputBuf=%d, channels=%d, "
241 frame_size, inputBufferSize, outputBufferSize, info.
channels,
244 in_buffer.
resize(inputBufferSize);
245 out_buffer.resize(outputBufferSize);
246 is_started = rc == 0;
250 void end()
override {
256 size_t write(
const uint8_t* data,
size_t len)
override {
257 if (!is_started)
return 0;
258 LOGD(
"EncoderALAC::write: %d", (
int)len);
259 for (
int j = 0; j < len; j++) {
260 in_buffer.
write(data[j]);
263 int32_t ioNumBytes = in_buffer.size();
264 int rc = enc.Encode(input_format, out_format, (uint8_t*)in_buffer.
data(),
265 out_buffer.data(), &ioNumBytes);
267 size_t written = p_print->write(out_buffer.data(), ioNumBytes);
268 if (ioNumBytes != written) {
269 LOGE(
"write error: %d -> %d", (
int)ioNumBytes, (
int)written);
256 size_t write(
const uint8_t* data,
size_t len)
override {
…}
286 uint32_t size = bin.size();
287 enc.GetMagicCookie(bin.data(), &size);
292 operator bool() {
return is_started && p_print !=
nullptr; }
295 const char*
mime()
override {
return "audio/alac"; }
299 enc.SetFastMode(fast);
305 LOGE(
"Can't change frame size on started encoder")
315 int frame_size = kALACDefaultFrameSize;
319 AudioFormatDescription input_format;
320 AudioFormatDescription out_format;
321 ALACSpecificConfig cfg;
323 Print* p_print =
nullptr;
324 bool is_started =
false;
326 AudioFormatDescription getInputFormat() {
327 AudioFormatDescription result;
328 memset(&result, 0,
sizeof(AudioFormatDescription));
330 result.mFormatID = kALACFormatLinearPCM;
331 result.mFormatFlags =
332 kALACFormatFlagIsSignedInteger |
333 kALACFormatFlagIsPacked;
335 result.mFramesPerPacket = 1;
337 result.mChannelsPerFrame = info.
channels;
343 AudioFormatDescription getOutputFormat() {
344 AudioFormatDescription result;
345 memset(&result, 0,
sizeof(AudioFormatDescription));
347 result.mFormatID = kALACCodecFormat;
349 result.mBytesPerPacket = 0;
350 result.mFramesPerPacket = frame_size;
351 result.mBytesPerFrame = 0;
352 result.mChannelsPerFrame = info.
channels;
359 kFormatFlag_16BitSourceData = 1,
360 kFormatFlag_20BitSourceData = 2,
361 kFormatFlag_24BitSourceData = 3,
362 kFormatFlag_32BitSourceData = 4
365 uint32_t getOutputFormatFlags(uint32_t bits) {
368 return kFormatFlag_16BitSourceData;
370 return kFormatFlag_20BitSourceData;
372 return kFormatFlag_24BitSourceData;
374 return kFormatFlag_32BitSourceData;
377 LOGE(
"Unsupported bit depth: %d", bits);