From af319b7bd3d48a2b41c54ea8a586666ca2c69661 Mon Sep 17 00:00:00 2001 From: Hans Dijkema Date: Mon, 23 Feb 2026 00:58:54 +0100 Subject: [PATCH] - --- .gitignore | 1 + libao/c/ao-play-async/ao_playasync.c | 112 ++++++++++++++++++--------- libao/c/ao-play-async/ao_playasync.h | 22 ++++-- libao/lib/ao-play-async.dll | Bin 0 -> 11264 bytes libao/lib/ao-play-async.exp | Bin 0 -> 1308 bytes libao/lib/ao-play-async.lib | Bin 0 -> 2726 bytes libao/libao-async-ffi.rkt | 8 +- libao/libao.rkt | 5 ++ play-test.rkt | 23 ++++-- 9 files changed, 119 insertions(+), 52 deletions(-) create mode 100644 libao/lib/ao-play-async.dll create mode 100644 libao/lib/ao-play-async.exp create mode 100644 libao/lib/ao-play-async.lib diff --git a/.gitignore b/.gitignore index 7893359..6d257d5 100644 --- a/.gitignore +++ b/.gitignore @@ -6,3 +6,4 @@ compiled/ \#* .\#* libao/c/build +libao/c/ao-play-async/build diff --git a/libao/c/ao-play-async/ao_playasync.c b/libao/c/ao-play-async/ao_playasync.c index 4da7911..64e268e 100644 --- a/libao/c/ao-play-async/ao_playasync.c +++ b/libao/c/ao-play-async/ao_playasync.c @@ -1,10 +1,32 @@ #include "ao_playasync.h" -#include + +#ifdef WIN32 +#include +#define USE_WINDOWS_THREADS +#define sleep_ms(ms) Sleep(ms) +#else +#define USE_PTHREADS +#define sleep_ms(ms) usleep(ms * 1000) +#endif + +#ifdef USE_WINDOWS_THREADS + #define MUTEX_LOCK(m) WaitForSingleObject(m, INFINITE) + #define MUTEX_UNLOCK(m) ReleaseMutex(m) +#endif + +#ifdef USE_PTHREADS + #include + #define MUTEX_LOCK(m) pthread_mutex_lock(&m) + #define MUTEX_UNLOCK(m) pthread_mutex_unlock(&m) +#endif + +#ifndef WIN32 #include +#endif + #include #include #include -//#include #include #include #include @@ -25,12 +47,21 @@ typedef struct _queue_ { struct _queue_ *prev; } Queue_t; +typedef int(*ao_play_func_t)(void *, char *, uint32_t); + typedef struct { Queue_t *play_queue; Queue_t *last_frame; ao_device *ao_device; +#ifdef USE_WINDOWS_THREADS + HANDLE mutex; + HANDLE thread; + DWORD thread_id; +#endif +#ifdef USE_PTHREADS pthread_mutex_t mutex; pthread_t thread; +#endif double at_second; ao_play_func_t ao_play_f; int buf_size; @@ -111,58 +142,48 @@ static void clear(AO_Handle *h) } } +#ifdef USE_PTHREADS static void *run(void *arg) +#endif +#ifdef USE_WINDOWS_THREADS +static DWORD run(LPVOID arg) +#endif { AO_Handle *handle = (AO_Handle *) arg; int go_on = (1 == 1); while(go_on) { - pthread_mutex_lock(&handle->mutex); + MUTEX_LOCK(handle->mutex); int has_frames = (handle->play_queue != NULL); if (has_frames) { Queue_t *q = get(handle); handle->at_second = q->at_second; - pthread_mutex_unlock(&handle->mutex); + MUTEX_UNLOCK(handle->mutex); if (q->command == STOP) { go_on = (1 == 0); } else { + //fprintf(stderr, "playing buf at %lf\n", handle->at_second); handle->ao_play_f(handle->ao_device, q->buf, q->buflen); } del_elem(q); } else { - pthread_mutex_unlock(&handle->mutex); - usleep(5000); // sleep for 5ms + MUTEX_UNLOCK(handle->mutex); + sleep_ms(5); // sleep for 5ms } } +#ifdef USE_PTHREADS return NULL; +#endif +#ifdef USE_WINDOWS_THREADS + return 0; +#endif } -/* -static void get_ao_play(void) -{ - char *lib = "libao.so"; - void *handle = dlopen(lib, RTLD_LAZY); - if (!handle) { - fprintf(stderr, "Cannot open library %s: %s\n", lib, dlerror()); - exit(EXIT_FAILURE); - } - - ao_play = dlsym(handle, "ao_play"); - char *err; - err = dlerror(); - if (err != NULL) { - fprintf(stderr, "Cannot get function ao_play: %s\n", err); - exit(EXIT_FAILURE); - } -} -*/ - - void *ao_create_async(void *ao_device_yeah, void *ao_play_f) { //if (ao_play == NULL) { get_ao_play(); } @@ -173,12 +194,22 @@ void *ao_create_async(void *ao_device_yeah, void *ao_play_f) handle->play_queue = NULL; handle->last_frame = NULL; handle->at_second = -1; - pthread_mutex_t m = PTHREAD_MUTEX_INITIALIZER; - handle->mutex = m; + handle->ao_play_f = ao_play_f; handle->buf_size = 0; +#ifdef USE_PTHREADS + pthread_mutex_t m = PTHREAD_MUTEX_INITIALIZER; + handle->mutex = m; pthread_create(&handle->thread, NULL, run, handle); +#endif + +#ifdef USE_WINDOWS_THREADS + handle->mutex = CreateMutex(NULL, // default security attributes + FALSE, // initially not owned + NULL); + handle->thread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE) run, handle, 0, &handle->thread_id); +#endif return (void *) handle; } @@ -187,14 +218,21 @@ void ao_stop_async(void *ao_handle) { AO_Handle *h = (AO_Handle *) ao_handle; - pthread_mutex_lock(&h->mutex); + MUTEX_LOCK(h->mutex); clear(h); Queue_t *q = new_elem(STOP, 0.0, 0, NULL); add(h, q); - pthread_mutex_unlock(&h->mutex); + MUTEX_UNLOCK(h->mutex); +#ifdef USE_PTHREADS void *retval; pthread_join(h->thread, &retval); +#endif +#ifdef USE_WINDOWS_THREADS + WaitForSingleObject(h->thread, INFINITE); + CloseHandle(h->thread); + CloseHandle(h->mutex); +#endif free(h); } @@ -202,26 +240,26 @@ void ao_play_async(void *ao_handle, double at_second, int buf_size, void *mem) { AO_Handle *h = (AO_Handle *) ao_handle; Queue_t *q = new_elem(PLAY, at_second, buf_size, mem); - pthread_mutex_lock(&h->mutex); + MUTEX_LOCK(h->mutex); add(h, q); - pthread_mutex_unlock(&h->mutex); + MUTEX_UNLOCK(h->mutex); } double ao_is_at_second_async(void *ao_handle) { AO_Handle *h = (AO_Handle *) ao_handle; - pthread_mutex_lock(&h->mutex); + MUTEX_LOCK(h->mutex); double s = h->at_second; - pthread_mutex_unlock(&h->mutex); + MUTEX_UNLOCK(h->mutex); return s; } int ao_bufsize_async(void *ao_handle) { AO_Handle *h = (AO_Handle *) ao_handle; - pthread_mutex_lock(&h->mutex); + MUTEX_LOCK(h->mutex); int s = h->buf_size; - pthread_mutex_unlock(&h->mutex); + MUTEX_UNLOCK(h->mutex); return s; } diff --git a/libao/c/ao-play-async/ao_playasync.h b/libao/c/ao-play-async/ao_playasync.h index d0c9dfb..3d11f18 100644 --- a/libao/c/ao-play-async/ao_playasync.h +++ b/libao/c/ao-play-async/ao_playasync.h @@ -1,14 +1,20 @@ #ifndef AO_PLAYASYNC_H #define AO_PLAYASYNC_H -#include +#ifdef _WINDOWS +#ifdef AOPLAYASYNC_LIBRARY +#define AOPLAYASYNC_EXPORT __declspec(dllexport) +#else +#define AOPLAYASYNC_EXPORT __declspec(dllimport) +#endif +#else +#define AOPLAYASYNC_EXPORT extern +#endif -typedef int(*ao_play_func_t)(void *, char *, uint32_t); - -extern void *ao_create_async(void *ao_handle, void *ao_play_f); -extern void ao_stop_async(void *handle); -extern void ao_play_async(void *handle, double at_second, int buf_size, void *mem); -extern double ao_is_at_second_async(void *handle); -extern int ao_bufsize_async(void *handle); +AOPLAYASYNC_EXPORT void *ao_create_async(void *ao_handle, void *ao_play_f); +AOPLAYASYNC_EXPORT void ao_stop_async(void *handle); +AOPLAYASYNC_EXPORT void ao_play_async(void *handle, double at_second, int buf_size, void *mem); +AOPLAYASYNC_EXPORT double ao_is_at_second_async(void *handle); +AOPLAYASYNC_EXPORT int ao_bufsize_async(void *handle); #endif // AO_PLAYASYNC_H diff --git a/libao/lib/ao-play-async.dll b/libao/lib/ao-play-async.dll new file mode 100644 index 0000000000000000000000000000000000000000..aa2503812b291acf9b4aaf9c527c8e8c4c15f48c GIT binary patch literal 11264 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 RiNOnlAK1!Y1pZ7t@Lx+uAE5vM literal 0 HcmV?d00001 diff --git a/libao/lib/ao-play-async.exp b/libao/lib/ao-play-async.exp new file mode 100644 index 0000000000000000000000000000000000000000..34f2a35cfb5028c50b688307156d2535655f04f7 GIT binary patch literal 1308 zcmb7D%We}f6us#b%Cj_x$EJ%cf>cC1lcp(DP^5|?)QVE778QgnMb6l*MxDgbJo=JY zut8!0Kfw>cjvXuZ@F{!&oa>pilcXE0_}qJsZ^qZY$Lhlf{l$3i5M8HixLV0X<^jwP zOodr3W!yN-5`M1It#r4#m9a#>vHmsB>2XUm@q~TeqsMW|xqSAx|Fb0;A%{junwf4W zk7i_i)bU*vhG3elbSDmub<>he_>q=LAr9iEOq#LwO-G$(@rO>MI5FKkqAMtF6w{$e zAXn~C1$f?iRp6NQrhr$iw+Osoy=frdm%}$k7p+$VUbEg);3exdfD_hR0baJ=0~){LoW+Ux!{K{XL!JW+paiM|ok;lE(ABzN_+DX%H%JQ-@l{ z`o#9-xcab5_h_*^hNJxAee4*gY5M$;=tba1CN?`sWoq+oWo>o+Ien+cW%3Uc3KF&; zkrkAitRP_v629o$OxS`%UJ&U+%^%r_%x)yxm1jYyV{y9Ub`YmBtZXHz3XG`N>UFVf z+U>LxBu8REQ{sYV-8+MifH46sjk;BW+@zC z>hx}anWIkwOoP4*F!S{7gn?t_%a#Y%O?1;@1{rf_hBtL|@AgpV2C? Kg%%+ywB{d>)Day3 literal 0 HcmV?d00001 diff --git a/libao/lib/ao-play-async.lib b/libao/lib/ao-play-async.lib new file mode 100644 index 0000000000000000000000000000000000000000..d9a930c84329625521ebf317a9a097223e0bbad0 GIT binary patch literal 2726 zcmcIm%}*0S6#uoQQW`agCU`NaLKHtrY3Wu?j4p~%0u)k8;zgIGTWAxYq%8+L=!FnT z4F8DnqJMyRAs$VPCrLa=Br);k9pBsC+0M3wvKl6NJM-TBX5O3kF|!x%=;d7DZa5Zk zw`knW3vR$33?>uyXeJEc6cAVgg4;m59|-MO6ixw59V9m?O+8Vlz@%v-Op2?GCPsc^ip(rL0^sPmDQyjG%YUWgkzcN44Rh>=3OhE-uqvTCSYe zt9i}Zt)6#Km1>F5rbfa@oP%JSY6yvQ5XFk7SG7t$S6VV^$R<)}#q7#lrTAPj&Moj9 z5v3N95QStd0Bi>Ve><>4f)vGRy8}oQ6^N&h!3RG=XhSf5=#IBe) z(!)H}%->R!C}wWg)d!mRCfk!#+L$l zHzj`4sXb#ofETZReeCv8MNve#^&9!wmHFN&ivu3f;I&}vUPb5q{-U8*_1=V-I!A*q zM0>V?5(p{=wrm{LvDLb$3z9y8W2uVB78O3ugVKxInTBIt!P!nqMSM2rfz!Bw&5f?{ zVy;}Ol;*0DzRcCg*hqTRo_BR8iDPq^KncsEPWn=Q)2Klg)LdzCne5)&@cH)l<#n`x zlAcK%Ujp+d&Y(Afv3t&-W6X@BMEU}ma^O?q*>|@^G0%j# z`r_|C)ys-f zyD9yYx(i^b!x}L`4(Dw(|O?_>aKI!po G^y^=k3{L_8 literal 0 HcmV?d00001 diff --git a/libao/libao-async-ffi.rkt b/libao/libao-async-ffi.rkt index bafe099..097597a 100644 --- a/libao/libao-async-ffi.rkt +++ b/libao/libao-async-ffi.rkt @@ -16,10 +16,14 @@ ao_bufsize_async ) -(define-runtime-path libao-async-path "./lib/libao-play-async") +(define-runtime-path libao-async-lib-path "./lib") + +(define lib (if (eq? (system-type 'os) 'windows) + (build-path libao-async-lib-path "ao-play-async") + (build-path libao-async-lib-path "libao-play-async"))) (define-ffi-definer define-libao-async - (ffi-lib libao-async-path '("0" #f) + (ffi-lib lib '("0" #f) #:get-lib-dirs (λ () (let ((sp (cons (build-path ".") (get-lib-search-dirs)))) ;(displayln sp) diff --git a/libao/libao.rkt b/libao/libao.rkt index 8b6314a..7c04a7f 100644 --- a/libao/libao.rkt +++ b/libao/libao.rkt @@ -164,6 +164,11 @@ audio-buf-len audio) ) + ;(let* ((handle-num (ao-handle-handle-num handle)) + ; (ao-device (hash-ref devices handle-num #f))) + ; (if (eq? ao-device #f) + ; (error "No device for this handle") + ; (ao_play ao-device audio audio-buf-len))) ) ) ) diff --git a/play-test.rkt b/play-test.rkt index 9b24c5f..14759c6 100644 --- a/play-test.rkt +++ b/play-test.rkt @@ -4,13 +4,21 @@ data/queue ) +(define test-file3 #f) +(let ((os (system-type 'os))) + (when (eq? os 'unix) + (set! test-file3 "/muziek/Klassiek-Viool/Alina Ibragimova/Paganini_24 Caprices (2021)/24. 24 Caprices, Op 1 - No. 24 in A minor- Tema con variazioni. Quasi presto.flac")) + (when (eq? os 'windows) + (set! test-file3 "C:\\Muziek\\Klassiek-Strijkkwartet\\Quatuor Zaïde\\Franz\\01 Erlkönig, D. 328 (Arr. For String Quartet by Eric Mouret).flac") + ;(set! test-file3 "C:\\Muziek\\Klassiek-Viool\\Janine Jansen\\Janine Jansen - Sibelius en Prokovief 1 (2024)\\02 - Violin Concerto in D Minor, Op. 47 II. Adagio di molto.flac") + ) + ) - -(define test-file3 "/muziek/Klassiek-Viool/Alina Ibragimova/Paganini_24 Caprices (2021)/24. 24 Caprices, Op 1 - No. 24 in A minor- Tema con variazioni. Quasi presto.flac") -(define fmt (ao-mk-format 24 48000 2 'big-endian)) -(define ao-h (ao-open-live #f fmt)) +;(define fmt (ao-mk-format 24 48000 2 'big-endian)) +;(define ao-h (ao-open-live #f fmt)) (define current-seconds 0) +(define ao-h #f) (define (flac-play frame buffer) (let* ((sample (hash-ref frame 'number)) @@ -21,12 +29,17 @@ (channels (hash-ref frame 'channels)) (bytes-per-sample-all-channels (* channels bytes-per-sample)) ) + (when (eq? ao-h #f) + (let ((fmt (ao-mk-format bits-per-sample rate channels 'big-endian))) + (set! ao-h (ao-open-live #f fmt)))) (ao-play ao-h second buffer) (let ((second-printer (λ () (let ((s (inexact->exact (round (ao-at-second ao-h))))) (when (> s current-seconds) (set! current-seconds s) - (displayln (format "At second: ~a" s))))))) + (let ((minutes (quotient s 60)) + (seconds (remainder s 60))) + (displayln (format "At time: ~a:~a" minutes seconds)))))))) (let* ((buf-size (ao-bufsize-async ao-h)) (buf-seconds (exact->inexact (/ buf-size bytes-per-sample-all-channels rate)))) (second-printer)