Skip to content

Commit deb2ded

Browse files
committed
Desktop Test for M4A
1 parent e3cb582 commit deb2ded

File tree

3 files changed

+117
-3
lines changed

3 files changed

+117
-3
lines changed

src/AudioTools/AudioCodecs/ContainerM4A.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -291,8 +291,8 @@ class ContainerM4A : public ContainerDecoder {
291291
if (header_pos == 8) {
292292
// Header complete
293293
header_pos = 0;
294-
LOGI("Found box: %s, size: %u, offset: %llu", current_box.type,
295-
current_box.size, current_box.absolute_offset);
294+
LOGI("Found box: %s, size: %u, offset: %u", current_box.type,
295+
current_box.size, (unsigned) current_box.absolute_offset);
296296

297297
// Handle special box sizes
298298
if (current_box.size == 1) {
@@ -451,7 +451,7 @@ class ContainerM4A : public ContainerDecoder {
451451
is_alac = true;
452452
result_codec_type = M4ACodecType::ALAC;
453453

454-
LOGI("Found ALAC config, size: %d", alac_config_size);
454+
LOGI("Found ALAC config, size: %u",(unsigned) alac_config_size);
455455

456456
// Extract basic audio parameters from config
457457
uint32_t frameLength = readUint32(alac_config, 0);
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
cmake_minimum_required(VERSION 3.20)
2+
3+
# set the project name
4+
project(m4a)
5+
set (CMAKE_CXX_STANDARD 11)
6+
set (DCMAKE_CXX_FLAGS "-Werror")
7+
8+
include(FetchContent)
9+
option(BUILD_SHARED_LIBS "Build using shared libraries" OFF)
10+
11+
# Build with alac
12+
FetchContent_Declare(codec-alac GIT_REPOSITORY "https://github.com/pschatzmann/codec-alac.git" GIT_TAG main )
13+
FetchContent_GetProperties(codec-alac)
14+
if(NOT codec-alac_POPULATED)
15+
FetchContent_Populate(codec-alac)
16+
add_subdirectory(${codec-alac_SOURCE_DIR} ${CMAKE_CURRENT_BINARY_DIR}/codec-alac)
17+
endif()
18+
19+
# Build with libhelix
20+
FetchContent_Declare(helix GIT_REPOSITORY "https://github.com/pschatzmann/arduino-libhelix.git" GIT_TAG main )
21+
FetchContent_GetProperties(helix)
22+
if(NOT helix_POPULATED)
23+
FetchContent_Populate(helix)
24+
add_subdirectory(${helix_SOURCE_DIR} ${CMAKE_CURRENT_BINARY_DIR}/helix)
25+
endif()
26+
27+
28+
# provide audio-tools
29+
if(CMAKE_SOURCE_DIR STREQUAL CMAKE_CURRENT_SOURCE_DIR)
30+
add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/../../.. ${CMAKE_CURRENT_BINARY_DIR}/arduino-audio-tools )
31+
endif()
32+
33+
# build sketch as executable
34+
set_source_files_properties(m4a.ino PROPERTIES LANGUAGE CXX)
35+
add_executable (m4a m4a.ino)
36+
37+
# set preprocessor defines
38+
target_compile_definitions(arduino_emulator PUBLIC -DDEFINE_MAIN)
39+
target_compile_definitions(m4a PUBLIC -DARDUINO -DIS_DESKTOP)
40+
target_compile_options(m4a PRIVATE -Wno-multichar)
41+
42+
43+
# set compile optioins
44+
target_compile_options(arduino-audio-tools INTERFACE -Wno-inconsistent-missing-override)
45+
46+
# specify libraries
47+
target_link_libraries(m4a PRIVATE
48+
codec-alac
49+
arduino_emulator
50+
arduino_helix
51+
arduino-audio-tools)

tests-cmake/codec/m4a/m4a.ino

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
/**
2+
* @file test-codec-alac.ino
3+
* @author Phil Schatzmann
4+
* @brief generate sine wave -> encoder -> decoder -> audiokit (i2s)
5+
* @version 0.1
6+
*
7+
* @copyright Copyright (c) 2025
8+
*
9+
*/
10+
#include "AudioTools.h"
11+
#include "AudioTools/AudioCodecs/CodecALAC.h"
12+
#include "AudioTools/AudioCodecs/CodecAACHelix.h"
13+
#include "AudioTools/AudioCodecs/ContainerM4A.h"
14+
#include "AudioTools/AudioCodecs/MultiDecoder.h"
15+
#include "SD.h"
16+
17+
MultiDecoder multi_decoder;
18+
ContainerM4A dec_m4a(multi_decoder);
19+
AACDecoderHelix dec_aac;
20+
DecoderALAC dec_alac;
21+
CsvOutput<int16_t> out(Serial);
22+
EncodedAudioOutput decoder_output(&out, &dec_m4a);
23+
File file;
24+
StreamCopy copier(decoder_output, file);
25+
26+
void setup() {
27+
Serial.begin(115200);
28+
AudioToolsLogger.begin(Serial, AudioToolsLogLevel::Debug);
29+
30+
if (!SD.begin()){
31+
Serial.println("SD Card initialization failed!");
32+
return;
33+
}
34+
35+
file = SD.open("/home/pschatzmann/Music/m4a/sample-1.m4a");
36+
if (!file.isOpen()) {
37+
Serial.println("Failed to open file!");
38+
return;
39+
}
40+
41+
// mp4 supports alac and aac
42+
multi_decoder.addDecoder(dec_alac,"audio/alac");
43+
multi_decoder.addDecoder(dec_aac,"audio/aac");
44+
45+
// start decoder output
46+
if(!decoder_output.begin()) {
47+
Serial.println("Failed to start decoder output!");
48+
return;
49+
}
50+
51+
// start csv output
52+
if (!out.begin()){
53+
Serial.println("Failed to start CSV output!");
54+
return;
55+
}
56+
57+
Serial.println("M4A decoding started...");
58+
}
59+
60+
61+
void loop() {
62+
copier.copy();
63+
}

0 commit comments

Comments
 (0)