Commit Graph

28 Commits

Author SHA1 Message Date
Loic Coenen
cc50577444 fix: cast atomic pointer loads/stores and remove duplicate free in writer_thread
Co-authored-by: aider (deepseek/deepseek-reasoner) <aider@aider.chat>
2026-05-12 18:01:57 +00:00
Loic Coenen
346c15d1c3 fix: use persistent MIDI client and fix save_ring race condition
Co-authored-by: aider (deepseek/deepseek-reasoner) <aider@aider.chat>
2026-05-11 22:14:33 +00:00
Loic Coenen
5430795510 feat: push loop output into save ring during playback
Co-authored-by: aider (deepseek/deepseek-reasoner) <aider@aider.chat>
2026-05-11 21:16:02 +00:00
Loic Coenen
5a2414b4c3 feat: add WAV load/save and ring buffer implementation
Co-authored-by: aider (deepseek/deepseek-reasoner) <aider@aider.chat>
2026-05-11 21:15:12 +00:00
Loic Coenen
20c0820910 refactor: use explicit pointer casts to clarify type conversions
Co-authored-by: aider (deepseek/deepseek-reasoner) <aider@aider.chat>
2026-05-09 14:46:09 +00:00
Loic Coenen
934843e9b1 fix: move cppcheck suppression comment to same line as assignment
Co-authored-by: aider (deepseek/deepseek-reasoner) <aider@aider.chat>
2026-05-09 13:23:32 +00:00
Loic Coenen
aa0b191b46 makefile
```makefile
<<<<<<< SEARCH
check:
	cppcheck --enable=all --error-exitcode=1 --suppress=missingIncludeSystem --suppress=usleepCalled --suppress=unreadVariable --suppress=normalCheckLevelMaxBranches src/*.c --library=posix .
=======
check:
	cppcheck --enable=all --error-exitcode=1 --suppress=unreadVariable src/*.c --library=posix .
>>>>>>> REPLACE
```

src/channel.c
```c
<<<<<<< SEARCH
#include "channel.h"
#include <jack/jack.h>
#include <stdatomic.h>
#include <stdio.h>
#include <string.h>
=======
// cppcheck-suppress missingIncludeSystem
#include "channel.h"
#include <jack/jack.h>
#include <stdatomic.h>
#include <stdio.h>
#include <string.h>
>>>>>>> REPLACE
```

src/channel.h
```c
<<<<<<< SEARCH
#include <jack/jack.h>
#include <stdatomic.h>
=======
// cppcheck-suppress missingIncludeSystem
#include <jack/jack.h>
#include <stdatomic.h>
>>>>>>> REPLACE
```

src/looper.c
```c
<<<<<<< SEARCH
#include "looper.h"
#include "channel.h"
#include "midi.h"
#include <jack/jack.h>
#include <jack/midiport.h>
#include <math.h>
#include <stdatomic.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
=======
// cppcheck-suppress missingIncludeSystem
#include "looper.h"
#include "channel.h"
#include "midi.h"
#include <jack/jack.h>
#include <jack/midiport.h>
#include <math.h>
#include <stdatomic.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
>>>>>>> REPLACE
```

src/looper.h
```c
<<<<<<< SEARCH
#include <jack/jack.h>
=======
// cppcheck-suppress missingIncludeSystem
#include <jack/jack.h>
>>>>>>> REPLACE
```

src/main.c
```c
<<<<<<< SEARCH
#include "looper.h"
#include <jack/jack.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <time.h>
=======
// cppcheck-suppress missingIncludeSystem
#include "looper.h"
#include <jack/jack.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <time.h>
>>>>>>> REPLACE
```

src/midi.c
```c
<<<<<<< SEARCH
#include "midi.h"
#include "channel.h"
#include <jack/jack.h>
#include <jack/midiport.h>
#include <stdatomic.h>
=======
// cppcheck-suppress missingIncludeSystem
#include "midi.h"
#include "channel.h"
#include <jack/jack.h>
#include <jack/midiport.h>
#include <stdatomic.h>
>>>>>>> REPLACE
```

src/midi.h
```c
<<<<<<< SEARCH
#include <jack/types.h>
=======
// cppcheck-suppress missingIncludeSystem
#include <jack/types.h>
>>>>>>> REPLACE
```

tests/integration.c
```c
<<<<<<< SEARCH
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>
#include <sys/wait.h>
#include <sys/types.h>
#include <string.h>
#include <stdarg.h>
#include <fcntl.h>
#include <jack/jack.h>
#include <jack/midiport.h>
#include <math.h>
#include <time.h>
=======
// cppcheck-suppress missingIncludeSystem
// cppcheck-suppress usleepCalled
// cppcheck-suppress normalCheckLevelMaxBranches
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>
#include <sys/wait.h>
#include <sys/types.h>
#include <string.h>
#include <stdarg.h>
#include <fcntl.h>
#include <jack/jack.h>
#include <jack/midiport.h>
#include <math.h>
#include <time.h>
>>>>>>> REPLACE
```

Co-authored-by: aider (deepseek/deepseek-reasoner) <aider@aider.chat>
2026-05-09 12:46:50 +00:00
Loic Coenen
c2df024350 style: reformat code and update cppcheck suppressions 2026-05-09 12:46:31 +00:00
Loic Coenen
7e9224cdc7 fix: replace usleep with nanosleep and fix const correctness
Co-authored-by: aider (deepseek/deepseek-reasoner) <aider@aider.chat>
2026-05-09 12:11:57 +00:00
Loic Coenen
1db9735e1b style: reformat code and reorder includes in looper.c and main.c 2026-05-09 12:11:55 +00:00
Loic Coenen
60a8bdcfe8 feat: add unbind command (note 63) to reset bind_channel to 0
Co-authored-by: aider (deepseek/deepseek-reasoner) <aider@aider.chat>
2026-05-09 11:14:52 +00:00
Loic Coenen
4bacab68c6 feat: implement bind feature for associating channels with MIDI notes
Co-authored-by: aider (deepseek/deepseek-reasoner) <aider@aider.chat>
2026-05-09 10:22:33 +00:00
Loic Coenen
b0dda3d8ed fix: defer port unregistration to avoid race condition in channel removal
Co-authored-by: aider (deepseek/deepseek-reasoner) <aider@aider.chat>
2026-05-09 10:00:33 +00:00
Loic Coenen
c0a0a6e968 fix: add null-checks for MIDI ports and use atomic access for channel active flag
Co-authored-by: aider (deepseek/deepseek-reasoner) <aider@aider.chat>
2026-05-09 09:57:36 +00:00
Loic Coenen
b73719e8bc fix: guard against NULL audio ports and defer channel activation until port registration succeeds
Co-authored-by: aider (deepseek/deepseek-reasoner) <aider@aider.chat>
2026-05-08 21:08:37 +00:00
Loic Coenen
96295fdb4c refactor: split monolithic main.c into modular source files
Co-authored-by: aider (deepseek/deepseek-reasoner) <aider@aider.chat>
2026-05-08 21:03:10 +00:00
Loic Coenen
9eb264aab8 feat: implement control key (note 64) and trigger looper command (note 62)
Co-authored-by: aider (deepseek/deepseek-reasoner) <aider@aider.chat>
2026-05-08 20:51:34 +00:00
Loic Coenen
6b6f2dee3c refactor: restructure looper into multi-channel architecture
Co-authored-by: aider (deepseek/deepseek-reasoner) <aider@aider.chat>
2026-05-08 20:38:37 +00:00
Loic Coenen
0e567e1829 remove signal handling 2026-05-08 09:14:40 +00:00
Loic Coenen
3bb5936d02 fix: move prev_state update after MIDI clock handler to fix race condition
Co-authored-by: aider (deepseek/deepseek-chat) <aider@aider.chat>
2026-05-07 22:51:28 +00:00
Loic Coenen
d4b3c2334b feat: implement loop recording and playback with integration test
Co-authored-by: aider (deepseek/deepseek-reasoner) <aider@aider.chat>
2026-05-07 21:41:36 +00:00
Loic Coenen
9d43b15b46 fix: use atomic operations for thread-safe state access
Co-authored-by: aider (deepseek/deepseek-reasoner) <aider@aider.chat>
2026-05-07 20:51:06 +00:00
Loic Coenen
f0b58a9684 test: add automated state verification to integration tests
Co-authored-by: aider (deepseek/deepseek-reasoner) <aider@aider.chat>
2026-05-07 20:47:39 +00:00
Loic Coenen
1bb7fe9a08 fix: add missing jack midi header and suppress unused parameter warnings
Co-authored-by: aider (deepseek/deepseek-reasoner) <aider@aider.chat>
2026-05-07 20:43:27 +00:00
Loic Coenen
a3efd70ba3 fix: remove blocking fprintf from real-time callback and zero output buffer
Co-authored-by: aider (deepseek/deepseek-reasoner) <aider@aider.chat>
2026-05-07 20:27:47 +00:00
Loic Coenen
2a630688e8 feat: implement MIDI clock transport control in process callback
Co-authored-by: aider (deepseek/deepseek-reasoner) <aider@aider.chat>
2026-05-07 20:17:14 +00:00
Loic Coenen
7014aa9e34 feat: add initial JACK audio looper with MIDI control
Co-authored-by: aider (deepseek/deepseek-reasoner) <aider@aider.chat>
2026-05-07 20:11:05 +00:00
Loic Coenen
14236b9312 feat: add main source file and makefile 2026-05-07 20:11:04 +00:00