Author: titmuss
Date: Wed Oct 29 07:48:13 2008
New Revision: 3226

URL: http://svn.slimdevices.com?rev=3226&root=Jive&view=rev
Log:
Bug: N/A
Description:
Mix sound effects in while playing back audio.


Modified:
    7.3/trunk/squeezeplay/src/squeezeplay/src/audio/decode/decode_alsa.c
    7.3/trunk/squeezeplay/src/squeezeplay/src/audio/decode/decode_sample.c

Modified: 7.3/trunk/squeezeplay/src/squeezeplay/src/audio/decode/decode_alsa.c
URL: 
http://svn.slimdevices.com/7.3/trunk/squeezeplay/src/squeezeplay/src/audio/decode/decode_alsa.c?rev=3226&root=Jive&r1=3225&r2=3226&view=diff
==============================================================================
--- 7.3/trunk/squeezeplay/src/squeezeplay/src/audio/decode/decode_alsa.c 
(original)
+++ 7.3/trunk/squeezeplay/src/squeezeplay/src/audio/decode/decode_alsa.c Wed 
Oct 29 07:48:13 2008
@@ -61,22 +61,24 @@
        if (!(current_audio_state & DECODE_STATE_RUNNING)) {
                memset(outputArray, 0, len);
 
-               /* mix in sound effects */
-               decode_sample_mix(outputArray, len);
-
-               return;
+               goto mixin_effects;
        }
        
        if (add_silence_ms) {
                add_bytes = SAMPLES_TO_BYTES((u32_t)((add_silence_ms * 
current_sample_rate) / 1000));
-               if (add_bytes > len) add_bytes = len;
-               memset(outputBuffer, 0, add_bytes);
-               outputBuffer += add_bytes;
+               if (add_bytes > len) {
+                       add_bytes = len;
+               }
+               memset(outputArray, 0, add_bytes);
+               outputArray += add_bytes;
                len -= add_bytes;
                add_silence_ms -= (BYTES_TO_SAMPLES(add_bytes) * 1000) / 
current_sample_rate;
-               if (add_silence_ms < 2)
+               if (add_silence_ms < 2) {
                        add_silence_ms = 0;
-               if (!len) return;
+               }
+               if (!len) {
+                       goto mixin_effects;
+               }
        }
 
        bytes_used = fifo_bytes_used(&decode_fifo);
@@ -97,7 +99,7 @@
                memset(outputArray, 0, len);
                DEBUG_ERROR("Audio underrun: used 0 bytes");
 
-               return;
+               goto mixin_effects;
        }
 
        if (bytes_used < len) {
@@ -159,6 +161,10 @@
        if (reached_start_point && current_sample_rate != pcm_sample_rate) {
                new_sample_rate = current_sample_rate;
        }
+
+ mixin_effects:
+       /* mix in sound effects */
+       decode_sample_mix(outputBuffer, SAMPLES_TO_BYTES(framesPerBuffer));
 
        return;
 }

Modified: 7.3/trunk/squeezeplay/src/squeezeplay/src/audio/decode/decode_sample.c
URL: 
http://svn.slimdevices.com/7.3/trunk/squeezeplay/src/squeezeplay/src/audio/decode/decode_sample.c?rev=3226&root=Jive&r1=3225&r2=3226&view=diff
==============================================================================
--- 7.3/trunk/squeezeplay/src/squeezeplay/src/audio/decode/decode_sample.c 
(original)
+++ 7.3/trunk/squeezeplay/src/squeezeplay/src/audio/decode/decode_sample.c Wed 
Oct 29 07:48:13 2008
@@ -7,6 +7,7 @@
 
 #include "common.h"
 #include "ui/jive.h"
+#include "audio/fixed_math.h"
 
 
 struct jive_sample {
@@ -21,10 +22,11 @@
 
 /* mixer channels */
 #define MAX_SAMPLES 2
-struct jive_sample *sample[MAX_SAMPLES];
+static struct jive_sample *sample[MAX_SAMPLES];
 
 #define MAXVOLUME 100
-int effect_volume = MAXVOLUME;
+static fft_fixed effect_gain = FIXED_ONE;
+static int effect_volume;
 
 
 static void sample_free(struct jive_sample *sample) {
@@ -44,6 +46,7 @@
        const Sint64 min_sample = -0x80000000LL;
        int i;
 
+       /* fixme: this crudely mixes the samples onto the buffer */
        for (i=0; i<MAX_SAMPLES; i++) {
                Sint32 *s, *d;
                size_t len;
@@ -61,17 +64,17 @@
                s = (Sint32 *) (sample[i]->data + sample[i]->pos);
                d = (Sint32 *) buffer;
                for (j=0; j<len>>2; j++) {
-                       Sint64 t = s[j];
-                       t = (t * effect_volume) / MAXVOLUME;
-                       t += d[j];
-
-                       if (t >= max_sample) {
-                               t = max_sample;
+                       Sint64 tmp = *(s++);
+                       tmp = fixed_mul(effect_gain, tmp);
+                       tmp += *d;
+
+                       if (tmp >= max_sample) {
+                               tmp = max_sample;
                        }
-                       else if (t <= min_sample) {
-                               t = min_sample;
+                       else if (tmp <= min_sample) {
+                               tmp = min_sample;
                        }
-                       d[j] = t;
+                       *(d++) = tmp;
                }
 
                sample[i]->pos += len;
@@ -253,12 +256,16 @@
         */
 
        effect_volume = lua_tointeger(L, 2);
-       //if (effect_volume > 0) {
-       //      open_audio();
-       //}
-       //else {
-       //      close_audio();
-       //}
+
+       if (effect_volume < 0) {
+               effect_volume = 0;
+       }
+       if (effect_volume > MAXVOLUME) {
+               effect_volume = MAXVOLUME;
+       }
+
+       effect_gain = fixed_div(s32_to_fixed(effect_volume),
+                               s32_to_fixed(MAXVOLUME));
 
        return 0;
 }

_______________________________________________
Jive-checkins mailing list
[email protected]
http://lists.slimdevices.com/cgi-bin/mailman/listinfo/jive-checkins

Reply via email to