44[ ![ Ubuntu-x64] ( https://github.com/newdigate/teensy-variable-playback/workflows/Ubuntu-x64/badge.svg )] ( https://github.com/newdigate/teensy-variable-playback/actions )
55[ ![ MIT license] ( https://img.shields.io/badge/License-MIT-blue.svg )] ( LICENSE )
66[ ![ CMake] ( https://img.shields.io/badge/project-CMake-brightgreen.svg?label=built%20with&colorA=555555&colorB=8a8fff&logo= )] ( CMakelists.txt )
7- [ ![ made-for-VSCode] ( https://img.shields.io/badge/Made%20for-VSCode-1f425f.svg )] ( https://code.visualstudio.com/ )
87[ ![ Contributors] ( https://img.shields.io/github/contributors/newdigate/teensy-variable-playback )] ( https://github.com/newdigate/teensy-variable-playback/graphs/contributors )
98[ ![ Commits] ( https://img.shields.io/github/commit-activity/m/newdigate/teensy-variable-playback )] ( https://github.com/newdigate/teensy-variable-playback/graphs/contributors )
109![ s] ( https://img.shields.io/badge/dynamic/json?color=%23e85b46&label=Patreon&query=data.attributes.patron_count&suffix=%20patrons&url=https%3A%2F%2Fwww.patreon.com%2Fapi%2Fcampaigns%2F4105381 )
@@ -15,60 +14,12 @@ Play 16-bit PCM RAW or WAV audio samples at variable playback rates on Teensy
1514* for best performance, use SDXC UHS 30MB/sec Application Performance Class 2 (A2) class micro SD-card.
1615 * [ SD classes on wikipedia] ( https://en.wikipedia.org/wiki/SD_card#cite_ref-93 )
1716
18- ## updates
19- * 2025-02-20: build for teensy/linux without needing to install dependencies, using CMake FetchContent to pull project-relative dependencies
20- * 2025-02-02: v1.1.0
21- * wide-ranging changes to allow more robust playback of multiple files
22- * buffers in heap or PSRAM, re-loaded by EventResponder rather than in interrupt
23- * mechanism to prevent attempted simultaneous filesystem accesses from playback and user code
24- * examples added: PlayPiano and FileAccess
25- * start playback at arbitrary point in file (` play_start::play_start_arbitrary ` )
26-
27- * 26/02/2022: v1.0.16:
28- * add option for starting sample at beginning or at loop start
29- ``` c
30- typedef enum play_start {
31- play_start_sample,
32- play_start_loop,
33- };
34-
35- wave.setPlayStart(play_start::play_start_loop);
36- ```
37- * 26/02/2022: v1.0.15:
38- * added support for dual playback head for seamless looping
39- * enable dual playback using linear crossfading
40- * set crossfade duration in number of samples
41- ``` c
42- AudioPlaySdResmp wave;
43- wave.setUseDualPlaybackHead(true);
44- wave.setCrossfadeDurationInSamples(1000);
45- wave.playRaw((int16_t*)kick_raw, kick_raw_len / 2, numberOfChannels);
46- wave.setLoopStart(0);
47- wave.setLoopFinish(3000);
48- ```
49- * 16/06/2022: v1.0.14:
50- * refactored code to generic classes
51- * improve memory leaks
52- * remove calls to StartUsingSPI(), StopUsingSPI(), __ disable_irq(), __ enable_irq()
53- * integrated with SerialFlash and LittleFS
54- * 25/09/2021: v1.0.13: positionMillis() implemented for AudioPlaySdResmp
55- * 25/08/2021: v1.0.12: Skip over RIFF tags in .wav header
56- * 12/08/2021: v1.0.11: When playing a mono sample, transmit on both channels (credit to @atoktoto )
57- * 28/07/2021: v1.0.10: Fix issues when starting playback in reverse
58- * 23/07/2021: v1.0.9: Fix issue which crashes teensy when playing multiple files from SD card using array of filenames
59- * 21/07/2021: v1.0.8: ** Breaking changes**
60- * ``` AudioPlaySdRawResmp ``` and ``` AudioPlaySdWaveResmp ``` merged into a single class ``` AudioPlaySdResmp ```
61- * ``` play(...) ``` method changed to ``` playRaw(...) ``` and ``` playWav(...) ``` , specify number of channels in parameters of playRaw
62- * 13/07/2021: v1.0.7: added multi-channel resampling
63- * 07/07/2021: v1.0.6: changed to using optimised floating point interpolation, sounds much better
64- * 30/06/2021: v1.0.5: Optimised quadratic interpolation to use fixed pipeline of 4 samples and use integers instead of floating point
65- * 25/06/2021: Quadratic interpolation is now working, but is disabled by default
66-
6717## contents
6818* [ code structure] ( #code-structure )
6919* [ requirements] ( #requirements )
7020* [ usage] ( #usage )
7121* [ example usage] ( #example-usage )
22+ * [ updates] ( #updates )
7223
7324## code structure
7425| folder | target | description |
@@ -96,8 +47,8 @@ Play 16-bit PCM RAW or WAV audio samples at variable playback rates on Teensy
9647<details >
9748 <summary >build for teensy with cmake and gcc-arm-none-eabi</summary >
9849* required software
99- ``` cmake `` ` [ gcc-arm-none-eabi] ( https://developer.arm.com/-/media/Files/downloads/gnu-rm/9-2019q4/RC2.1 )
100- * remember to update ``` COMPILERPATH ``` in ``` cmake\toolchains\teensy41.cmake ``` to ``` gcc-arm-none-eabi\bin `` ` folder
50+ ` cmake ` [ gcc-arm-none-eabi] ( https://developer.arm.com/-/media/Files/downloads/gnu-rm/9-2019q4/RC2.1 )
51+ * remember to update ` COMPILERPATH ` in ` cmake\toolchains\teensy41.cmake ` to ` gcc-arm-none-eabi\bin ` folder
10152
10253<details >
10354 <summary >dependencies (click to expand image) </summary >
@@ -278,5 +229,59 @@ void loop() {
278229
279230</details>
280231
232+ ## updates
233+
234+ <details>
235+ <summary>updates</summary>
236+
237+ * 2025-02-20: build for teensy/linux without needing to install dependencies, using CMake FetchContent to pull project-relative dependencies
238+ * 2025-02-02: v1.1.0
239+ * wide-ranging changes to allow more robust playback of multiple files
240+ * buffers in heap or PSRAM, re-loaded by EventResponder rather than in interrupt
241+ * mechanism to prevent attempted simultaneous filesystem accesses from playback and user code
242+ * examples added: PlayPiano and FileAccess
243+ * start playback at arbitrary point in file (`play_start::play_start_arbitrary`)
244+
245+ * 26/02/2022: v1.0.16:
246+ * add option for starting sample at beginning or at loop start
247+ ``` c
248+ typedef enum play_start {
249+ play_start_sample,
250+ play_start_loop,
251+ };
252+
253+ wave.setPlayStart(play_start::play_start_loop);
254+ ```
255+ * 26/02/2022: v1.0.15:
256+ * added support for dual playback head for seamless looping
257+ * enable dual playback using linear crossfading
258+ * set crossfade duration in number of samples
259+ ``` c
260+ AudioPlaySdResmp wave;
261+ wave.setUseDualPlaybackHead(true );
262+ wave.setCrossfadeDurationInSamples(1000 );
263+ wave.playRaw((int16_t *)kick_raw, kick_raw_len / 2 , numberOfChannels);
264+ wave.setLoopStart(0 );
265+ wave.setLoopFinish(3000 );
266+ ```
267+ * 16/06/2022: v1.0.14:
268+ * refactored code to generic classes
269+ * improve memory leaks
270+ * remove calls to StartUsingSPI(), StopUsingSPI(), __ disable_irq(), __ enable_irq()
271+ * integrated with SerialFlash and LittleFS
272+ * 25/09/2021: v1.0.13: positionMillis() implemented for AudioPlaySdResmp
273+ * 25/08/2021: v1.0.12: Skip over RIFF tags in .wav header
274+ * 12/08/2021: v1.0.11: When playing a mono sample, transmit on both channels (credit to @atoktoto )
275+ * 28/07/2021: v1.0.10: Fix issues when starting playback in reverse
276+ * 23/07/2021: v1.0.9: Fix issue which crashes teensy when playing multiple files from SD card using array of filenames
277+ * 21/07/2021: v1.0.8: ** Breaking changes**
278+ * ``` AudioPlaySdRawResmp ``` and ``` AudioPlaySdWaveResmp ``` merged into a single class ``` AudioPlaySdResmp ```
279+ * ``` play(...) ``` method changed to ``` playRaw(...) ``` and ``` playWav(...) ``` , specify number of channels in parameters of playRaw
280+ * 13/07/2021: v1.0.7: added multi-channel resampling
281+ * 07/07/2021: v1.0.6: changed to using optimised floating point interpolation, sounds much better
282+ * 30/06/2021: v1.0.5: Optimised quadratic interpolation to use fixed pipeline of 4 samples and use integers instead of floating point
283+ * 25/06/2021: Quadratic interpolation is now working, but is disabled by default
284+ </details >
285+
281286# credits
282287* convert boost test report to junit xml format: [ Stuart Lange] ( https://stackoverflow.com/a/2975928/4634140 )
0 commit comments