Fluidsynth: output PCM if there is no FPU
authorRémi Denis-Courmont <remi@remlab.net>
Tue, 1 Sep 2009 18:37:26 +0000 (21:37 +0300)
committerRémi Denis-Courmont <remi@remlab.net>
Tue, 1 Sep 2009 18:37:53 +0000 (21:37 +0300)
modules/codec/fluidsynth.c

index aa31abe..22ef5bf 100644 (file)
@@ -59,6 +59,7 @@ struct decoder_sys_t
     fluid_settings_t *settings;
     fluid_synth_t    *synth;
     int               soundfont;
+    bool              fixed;
     date_t            end_date;
 };
 
@@ -81,15 +82,6 @@ static int Open (vlc_object_t *p_this)
         return VLC_EGENERIC;
     }
 
-    p_dec->fmt_out.i_cat = AUDIO_ES;
-    p_dec->fmt_out.audio.i_rate = 44100;
-    p_dec->fmt_out.audio.i_channels = 2;
-    p_dec->fmt_out.audio.i_original_channels =
-    p_dec->fmt_out.audio.i_physical_channels =
-        AOUT_CHAN_LEFT | AOUT_CHAN_RIGHT;
-    p_dec->fmt_out.i_codec = VLC_CODEC_FL32;
-    p_dec->fmt_out.audio.i_bitspersample = 32;
-
     p_dec->pf_decode_audio = DecodeBlock;
     p_sys = p_dec->p_sys = malloc (sizeof (*p_sys));
     if (p_sys == NULL)
@@ -110,6 +102,24 @@ static int Open (vlc_object_t *p_this)
         return VLC_EGENERIC;
     }
 
+    p_dec->fmt_out.i_cat = AUDIO_ES;
+    p_dec->fmt_out.audio.i_rate = 44100;
+    p_dec->fmt_out.audio.i_channels = 2;
+    p_dec->fmt_out.audio.i_original_channels =
+    p_dec->fmt_out.audio.i_physical_channels =
+        AOUT_CHAN_LEFT | AOUT_CHAN_RIGHT;
+    if (vlc_CPU () & CPU_CAPABILITY_FPU)
+    {
+        p_dec->fmt_out.i_codec = VLC_CODEC_FL32;
+        p_dec->fmt_out.audio.i_bitspersample = 32;
+        p_sys->fixed = false;
+    }
+    else
+    {
+        p_dec->fmt_out.i_codec = VLC_CODEC_S16N;
+        p_dec->fmt_out.audio.i_bitspersample = 16;
+        p_sys->fixed = true;
+    }
     date_Init (&p_sys->end_date, p_dec->fmt_out.audio.i_rate, 1);
     date_Set (&p_sys->end_date, 0);
 
@@ -188,9 +198,14 @@ static aout_buffer_t *DecodeBlock (decoder_t *p_dec, block_t **pp_block)
 
     p_out->start_date = date_Get (&p_sys->end_date );
     p_out->end_date   = date_Increment (&p_sys->end_date, samples);
-    fluid_synth_write_float (p_sys->synth, samples,
-                             p_out->p_buffer, 0, 2,
-                             p_out->p_buffer, 1, 2);
+    if (!p_sys->fixed)
+        fluid_synth_write_float (p_sys->synth, samples,
+                                 p_out->p_buffer, 0, 2,
+                                 p_out->p_buffer, 1, 2);
+    else
+        fluid_synth_write_s16 (p_sys->synth, samples,
+                               (int16_t *)p_out->p_buffer, 0, 2,
+                               (int16_t *)p_out->p_buffer, 1, 2);
 drop:
     block_Release (p_block);
     return p_out;