From 9a0ef7d76eb364ae78b879a26e9330249e0bdd28 Mon Sep 17 00:00:00 2001 From: Hans Dijkema Date: Mon, 4 May 2026 11:10:03 +0200 Subject: [PATCH] version = 3, removed flac support, only ao type is supported from now, i.e. channel interleaved samples --- ao-play-async/ao_playasync.c | 115 ++--------------------------------- ao-play-async/ao_playasync.h | 2 +- lib/linux-x86_64.zip | Bin 689931 -> 689324 bytes 3 files changed, 5 insertions(+), 112 deletions(-) diff --git a/ao-play-async/ao_playasync.c b/ao-play-async/ao_playasync.c index 9e1b113..f751f4a 100644 --- a/ao-play-async/ao_playasync.c +++ b/ao-play-async/ao_playasync.c @@ -579,44 +579,6 @@ void ao_stop_async(void *ao_handle) fprintf(stderr, "async handle freed\n"); } -/* -(define (abs x) (if (>= x 0) x (* x -1))) - -(define (make-sample-bytes sample bytes-per-sample endianess) - (letrec ((mk (lambda (i d) - (if (< i bytes-per-sample) - (cons (bitwise-and d 255) - (mk (+ i 1) (arithmetic-shift d -8))) - '())))) - (let ((bytes (mk 0 sample))) - (if (eq? endianess 'big-endian) - (reverse bytes) - bytes)))) - - ;(get-sample (lambda (k channel) - ; (let ((chan-buf (list-ref buffer channel))) - ; (vector-ref chan-buf k)))) - ) - ;(letrec ((i 0) - ; (fill (lambda (k channel) - ; (if (< k buf-len) - ; (if (< channel channels) - ; (let* ((sample (get-sample k channel)) - ; (bytes (make-sample-bytes sample bytes-per-sample endianess)) - ; ) - ; (for-each (lambda (byte) - ; (ptr-set! audio _byte i byte) - ; (set! i (+ i 1))) - ; bytes) - ; ;; process sample - ; (fill k (+ channel 1))) - ; (fill (+ k 1) 0)) - ; 'filled)) - ; )) - ; (fill 0 0) - -*/ - #define AO_FMT_LITTLE 1 #define AO_FMT_BIG 2 #define AO_FMT_NATIVE 4 @@ -640,87 +602,18 @@ static inline void make_sample_bytes(int32_t sample, int bytes_per_sample, int b } } -void *convertFlac(void *mem, int buf_len, BufferInfo_t *info, int *audio_size) -{ - // buf_size equals number of samples of 32bit for all channels. So buf_size for flac = 4 * buf_len * channels - - int bytes = info->sample_bits / 8; - int endianess = info->endiannes; - - int little_endian = (endianess == AO_FMT_LITTLE); - if (!little_endian && endianess == AO_FMT_NATIVE) little_endian = littleEndian(); - int big_endian = !little_endian; - - int store_size = info->channels * bytes * buf_len; - unsigned char *new_mem = (unsigned char *) malloc(store_size); - *audio_size = store_size; - int32_t **buffer = (int32_t **) mem; - int i, k, channel; - - i = 0; - for(k = 0; k < buf_len; k++) { - for(channel = 0; channel < info->channels; channel++) { - int32_t *chan = buffer[channel]; - int32_t sample = chan[k]; - unsigned char b[4]; - make_sample_bytes(sample, bytes, big_endian, b); - for(int j = 0; j < bytes; j++) { - new_mem[i++] = b[j]; - } - } - } - - return (void *) new_mem; -} - void ao_play_async(void *ao_handle, int music_id, double at_second, double music_duration, int buf_size, void *mem, BufferInfo_t info) { AO_Handle *h = (AO_Handle *) ao_handle; Queue_t *q = NULL; - switch(info.type) { - case flac: { - int store_size = 0; - void *store_mem = convertFlac(mem, buf_size, &info, &store_size); + int ao_size = 0; + void *ao_mem = convert_req_to_real(ao_handle, mem, buf_size, &info, &ao_size); - int ao_size = 0; - void *ao_mem = convert_req_to_real(ao_handle, store_mem, store_size, &info, &ao_size); + q = new_elem(PLAY, music_id, at_second, music_duration, ao_size, ao_mem); - q = new_elem(PLAY, music_id, at_second, music_duration, ao_size, ao_mem); - - free(store_mem); - free(ao_mem); - } - break; - case ao: { - int ao_size = 0; - void *ao_mem = convert_req_to_real(ao_handle, mem, buf_size, &info, &ao_size); - - q = new_elem(PLAY, music_id, at_second, music_duration, ao_size, ao_mem); - - free(ao_mem); - } - break; - case mpg123: { - static int warned = 0; - if (!warned) { - warned = 1; - fprintf(stderr, "format mpg123 not supported yet\n"); - } - return; - } - break; - case ao_ogg: { - static int warned = 0; - if (!warned) { - warned = 1; - fprintf(stderr, "format ao_ogg not supported yet\n"); - } - return; - } - break; - } + free(ao_mem); add(h, q); } diff --git a/ao-play-async/ao_playasync.h b/ao-play-async/ao_playasync.h index 08c79d5..c2aaf59 100644 --- a/ao-play-async/ao_playasync.h +++ b/ao-play-async/ao_playasync.h @@ -11,7 +11,7 @@ #define AOPLAYASYNC_EXPORT extern #endif -#define VERSION 2 +#define VERSION 3 typedef enum { ao = 1, diff --git a/lib/linux-x86_64.zip b/lib/linux-x86_64.zip index e5cfd36675eaf5865a2a573775b0213392c46ef0..4662daf42b3693fa1f2b86466725b1bf163cb5fa 100644 GIT binary patch delta 7496 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