From 58793f3a142239e4cf9133eb0034870a2bdec9f6 Mon Sep 17 00:00:00 2001 From: Hans Dijkema Date: Wed, 25 Feb 2026 13:47:51 +0100 Subject: [PATCH] - --- lib/linux-x86_64/libao-play-async.so | Bin 16624 -> 16664 bytes libao/c/ao-play-async/ao_playasync.c | 13 +++++++++++-- libao/libao-async-ffi.rkt | 4 ++++ libao/libao-async.rkt | 16 +++++++++++++++- libao/libao.rkt | 6 ++++++ libtag/taglib.rkt | 2 +- 6 files changed, 37 insertions(+), 4 deletions(-) diff --git a/lib/linux-x86_64/libao-play-async.so b/lib/linux-x86_64/libao-play-async.so index 0ef5f00a11bd625f59c442a8141433ee24761c7f..5401d6b02e4a5c89e855ccd725bb92db605405cc 100755 GIT binary patch delta 1932 zcmZ8iZETZO6u$S}+O9~qwcGl!FuQK(Hqdq(!xbh_#AfdjkWDr+1l$&ffyBTFEYZjq zV}NTavT_!Jzz_FhC>jMUn&}T25CSubk|+if6(h#VP%7Z4e7!#R{Xpa<=RWs5_ndRj zJ@@TtvWM^9%==6E?pRs1wb07cQ5YM{iEWr6|8eD4KX+M%Q)4t&niQAQnmIp7gXymBjc%A?)M~(nfDV?)N}U>E7U40zg$Um7 zQdM?Z12!M~g5U4a2wCTgb>5-#3v|9l=UX)1aqr+H3`C&uc!g;xx3sNk>1gX*M_bH| z^qqO?LM;u>(%Dihv-N04V!Lp46MIGH22?$rZPE4IRjX{GQag0LGk+DzF0nV`4VLbV z53^e({tUG_=JUq*2aZ>z1(y(4j)s$R?}%HDoJthmRurK}L+x8fI&;*mD3iC2thWp! zBpWjgi%cTn%e`HfS=N?*!ympjdLgfxuc5tpbtSv*D#}>?{gHESDaz44yi;NcR=r&b zmbG;vJ>;z7-&4q0S@IL|yqaYX$#S&mEjSL#k@{wVr$VjbNNw3pZ#Wlanh{-&9RE!4 ziE_H)bn(+(YMLBEr$Wcic*NFQ?aNlSXBn-oI!nOw~ zsj6Ovb|X$S6q2_$UC_q#R>wfs8+U2R~kCY<#dQ;+dN>N5nT+4d+W|JKGRqnk^ zzqsZEUl-9M;S{Xz6*@x=)ueG+631_TO z!q?Fk?gE}im)w5-D0w^u(&-yC<}MWOPn^G@xkp2-k??gjkbci@>_o%Y|Ce&19O+6# zIxkX#C%1Tq;o5XDQr~{R>vZh&kDg#G-sj0S?=0NVEq=ug$U9dQMSLaANkzE;TnS78 zkNu@6+4zVuuPRD8@FQS7u=$#zbO1fq5fQiucnBB+ehobIx1uD0ACD_aE?#jXPObu) zQI$sE0^oXyIoTd820;7oWEo^7t@XL214;U` zDBm;y;v60DdHHf0#e9K&$J|5KA}`-dWkufbC&=52d{{U$dz&=RW=?bRiIxmj2&xhM zFz%yv5o15xn%0H8T>5<4Vm?m3szBL;eKm|Ch)@sq)#X%C<>DLFIi}9< z5eIWptW7__s|c+>ho@BCh3h+nZk-}li06-&O_wE;=(#Isnb{lPRy{?cgEI#C)6_6C zU^fb8U@67G8f7(bh|YpFN@bv*>@@*vP%mJR>T0U3eY)015oku?%j2UpwVbae`>cR9 yssD8(sczP5d>@^i6|lQ~T4fDvj@xI?kDp$HV$k}6nr1^z-hTlGXh}W* delta 1674 zcmZWpdrVtZ7{BM1$Grq-3oC6=ECn_mB9~{nTG`rY!(GC_1zBp0u^3%oS#%_uGG)TR zjbb%f_W>c%#V!7^`I_K$i*t#srF4ajocRGmJk=Okg4D+-^fQrtxXqeuLl8)04yM9yIv< zg+16ro_j+%lsOc8Ta?bku&wGIJPjXIIqP8$JW$X` zu0uybJz0Sx1s<3xXwNM}UwQQ6m#ikW4RV}LvIHBQj|{l~)FP`ai@v`p{eoF&X1lC6 z=H+<0fW_>RtuM^Z@XYr~mgy*F9`D2*M!yB-`Yy)TSfik!b%T!wgYsLQR}HhbO)Z;%p-yK**I}wn;PZOldXifv)QL-s#*Wm~j5aXk>qqk{l7L@bMWg`)cMW+AeC{HCX$?eoaqWNZSzFWZi3g*j;nlk% z97jz&ygGkLNxE$r_=&rZ755LY2V%#4`Ua&_h>;|vi-_Hb?2nsUrc}V6BzJ|<3dFOB zGGgR+O1lx=tCYqNI}lGJCJ-+p9=}Pcia7ZPrP=rqq8PmzQAKP;l(61CJpRu8cz6>9 z^N1gT-CItQ;78gAU0$bqFQ#<@(=gZlc-V(~8WLU)`5C5>J`dj^Rbd(FDA-Fp z@r36v)oe_G3+LL7@Q>zXSS%zvQ{akG^aRR3#uBtgYU;zo7XCW3;5Zhi4{ctDalEe@ z&LSOyD@ZTEO{6L~N<9t-7NZTj?!*Ig7m@P#<#H*`s7DR|jq<*lRo_26Z*h zc!TM>kc}L+YK_sArL)`wOxLvAIb+sk8qx^ZC5Z?Sl05uEhVrbm#FK2;R$q>PMQ^=? zcb}|3^}iX#9zL5MA?RvoDTx|0$DAz}4eh_P3%+UCNfyD|DB15FP;F4x=p-*{bV#G` z071z)?ffk)QfH5rd1sbifBATWm@y5G2?yf3qaUjF}pP-sTbfpzF<& j-R9LBYvN|bzhx^=rrmutex); - int has_frames = (handle->play_queue != NULL); + int has_frames = (!handle->paused) && (handle->play_queue != NULL); if (has_frames) { Queue_t *q = get(handle); @@ -201,6 +202,7 @@ void *ao_create_async(void *ao_device_yeah, void *ao_play_f) handle->ao_play_f = ao_play_f; handle->buf_size = 0; + handle->paused = (1 == 0); #ifdef USE_PTHREADS pthread_mutex_t m = PTHREAD_MUTEX_INITIALIZER; @@ -266,7 +268,6 @@ double ao_is_at_second_async(void *ao_handle) return s; } - double ao_music_duration_async(void *ao_handle) { AO_Handle *h = (AO_Handle *) ao_handle; @@ -285,4 +286,12 @@ int ao_bufsize_async(void *ao_handle) return s; } +void ao_pause_async(void *ao_handle, int paused) +{ + AO_Handle *h = (AO_Handle *) ao_handle; + MUTEX_LOCK(h->mutex); + h->paused = paused; + MUTEX_UNLOCK(h->mutex); +} + diff --git a/libao/libao-async-ffi.rkt b/libao/libao-async-ffi.rkt index 0a9fd04..eb73c75 100644 --- a/libao/libao-async-ffi.rkt +++ b/libao/libao-async-ffi.rkt @@ -14,6 +14,7 @@ ao_music_duration_async ao_bufsize_async ao_clear_async + ao_pause_async ) (define lib (get-lib '("ao-play-async" "libao-play-async") '(#f))) @@ -42,3 +43,6 @@ ;extern void ao_clear_async(void *handle); (define-libao-async ao_clear_async(_fun _libao-async-handle-pointer -> _void)) +;extern void ao_pause_async(void *handle, int pause); +(define-libao-async ao_pause_async(_fun _libao-async-handle-pointer int -> _void)) + diff --git a/libao/libao-async.rkt b/libao/libao-async.rkt index 79a77a8..d8ce323 100644 --- a/libao/libao-async.rkt +++ b/libao/libao-async.rkt @@ -13,6 +13,7 @@ ao_music_duration_async ao_bufsize_async ao_clear_async + ao_pause_async ) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; @@ -43,6 +44,7 @@ queue-sem [queue #:mutable] [stopped #:mutable] + [paused #:mutable] ) #:transparent ) @@ -53,6 +55,14 @@ (λ () (let ((ao-device (ao-shm-device shm))) (define (player) + + (mutex-lock (ao-shm-mutex shm)) + (let ((p (ao-shm-paused shm))) + (mutex-unlock (ao-shm-mutex shm)) + (when p + (sleep 0.25) + (player))) + (os-semaphore-wait (ao-shm-queue-sem shm)) (mutex-lock (ao-shm-mutex shm)) (if (= (queue-length (ao-shm-queue shm)) 0) @@ -97,7 +107,7 @@ ) (define (ao-player ao_device) - (let ((shm (make-ao-shm (make-mutex) ao_device 0.0 0.0 0 (make-os-semaphore) (make-queue) #f))) + (let ((shm (make-ao-shm (make-mutex) ao_device 0.0 0.0 0 (make-os-semaphore) (make-queue) #f #f))) (ao-player* shm) shm ) @@ -173,4 +183,8 @@ (set-ao-shm-queue! shm (make-queue)) (set-ao-shm-bufsize! shm 0) ) + +(define (ao_pause_async shm pause) + (set-ao-shm-paused! shm pause) + ) diff --git a/libao/libao.rkt b/libao/libao.rkt index ad7eba6..7c7717b 100644 --- a/libao/libao.rkt +++ b/libao/libao.rkt @@ -230,6 +230,12 @@ ) ) +(define (ao-pause handle pause) + (if (eq? libao-async-mode 'ffi) + (ffi:ao_pause_async (ao-handle-async-player handle) pause) + (scm:ao_pause_async (ao-handle-async-plauer handle) pause) + )) + (define (ao-at-second handle) (if (eq? libao-async-mode 'ffi) (ffi:ao_is_at_second_async (ao-handle-async-player handle)) diff --git a/libtag/taglib.rkt b/libtag/taglib.rkt index ef56a3c..7d1e8ff 100644 --- a/libtag/taglib.rkt +++ b/libtag/taglib.rkt @@ -248,7 +248,7 @@ 'jpg) ((string-suffix? mt "/png") 'png) - (else (error (format "mimetype not supported: ~a" mt))) + (else #f) ) ))