ear/extract; extras; samples: Fixes
[sdk] / extras / audio / alsa.ec
index e2fb0d6..563190b 100644 (file)
@@ -12,7 +12,7 @@ static AudioSpec audioSpec { };
 static bool paused;
 static Semaphore pauseSemaphore { };
 
-static char *device = "default";
+static const char *device = "default";
 
 static snd_mixer_t *mixer_handle;
 
@@ -35,8 +35,8 @@ public bool AudioSetVolume(VolumeControl type, double percent)
    {
       snd_mixer_elem_t *elem;
       snd_mixer_selem_id_t *sid;
-      int pmin, pmax;
-      int get_vol, set_vol;
+      long pmin, pmax;
+      int set_vol;
       float f_multi;
 
        snd_mixer_load(mixer_handle);
@@ -75,7 +75,7 @@ public bool AudioGetVolume(VolumeControl type, double * percent)
       snd_mixer_elem_t *elem;
       snd_mixer_selem_id_t *sid;
       long pmin, pmax;
-      long get_vol, set_vol;
+      long set_vol;
       float f_multi;
 
        snd_mixer_load(mixer_handle);
@@ -116,7 +116,6 @@ public void CloseMixer()
 public int OpenAudio(AudioSpec wanted, AudioSpec result)
 {
    int err;
-   unsigned int i;
 
    buffer = new byte[wanted.samples * wanted.channels * wanted.bits / 8];
    memset(buffer, 0, wanted.samples * wanted.channels * wanted.bits / 8);
@@ -132,7 +131,7 @@ public int OpenAudio(AudioSpec wanted, AudioSpec result)
                                  wanted.channels,
                                  wanted.freq,
                                  1,
-                                 500000)) < 0)
+                                 50000)) < 0)
    {   /* 0.5sec */
       printf("Playback open error: %s\n", snd_strerror(err));
       return 0;
@@ -185,15 +184,16 @@ static class SoundThread : Thread
          {
             int c;
             short int * samples = (short int *)buffer;
-            double m = volume / (1 + Abs(balance * 2 - 1));
+            double m = volume / (1 + Abs(balance * 2 - 1)) / 100.0;
             double ll = (2 - (2 * Max(balance, 0.5)))* m;
             double lr = (-2 * Min(balance, 0.5) + 1) * m;
             double rl = (2 * Max(balance, 0.5) - 1)  * m;
             double rr = (2 * Min(balance, 0.5))      * m;
+            uint numSamples = audioSpec.samples/16;
             // printf("Volume: %f, m : %f, Left: (%f, %f), Right: (%f, %f) \n", volume, m, ll, lr, rl, rr);
 
-            audioSpec.callback(audioSpec.userdata, buffer, audioSpec.samples * audioSpec.channels * audioSpec.bits / 8);
-            for(c = 0; c<audioSpec.samples; c++)
+            audioSpec.callback(audioSpec.userdata, buffer, numSamples * audioSpec.channels * audioSpec.bits / 8);
+            for(c = 0; c<numSamples; c++)
             {
                short sLeft = samples[0], sRight = samples[1];
                samples[0] = (short)(sLeft * ll + sRight * lr);
@@ -201,16 +201,16 @@ static class SoundThread : Thread
                samples += 2;
             }
 
-            frames = snd_pcm_writei(handle, buffer, audioSpec.samples);
+            frames = snd_pcm_writei(handle, buffer, numSamples);
             if(frames < 0)
-               frames = snd_pcm_recover(handle, frames, 0);
+               frames = snd_pcm_recover(handle, (int)frames, 0);
             if (frames < 0)
             {
-               printf("snd_pcm_writei failed: %s\n", snd_strerror(frames));
+               printf("snd_pcm_writei failed: %s\n", snd_strerror((int)frames));
                break;
             }
-            if (frames > 0 && frames < audioSpec.samples)
-               printf("Short write (expected %li, wrote %li)\n", (long)sizeof(buffer), frames);
+            if (frames > 0 && frames < numSamples)
+               printf("Short write (expected %ui, wrote %li)\n", numSamples, frames);
          }
       }
       return 0;