]> git.alsa-project.org Git - alsa-oss.git/commitdiff
Further fixes
authorAbramo Bagnara <abramo@alsa-project.org>
Sun, 21 Jan 2001 17:13:14 +0000 (17:13 +0000)
committerAbramo Bagnara <abramo@alsa-project.org>
Sun, 21 Jan 2001 17:13:14 +0000 (17:13 +0000)
alsa-oss.c

index e9ca8dcba01abb042c8c40d4eb140d15bc57d73a..bdc61c5faa49d4151fe5d7d4c2cb7970cf170cd4 100644 (file)
@@ -176,14 +176,13 @@ static int alsa_format_to_oss(int format)
        }
 }
 
-static int oss_dsp_params(oss_dsp_t *dsp)
+static int oss_dsp_hw_params(oss_dsp_t *dsp)
 {
        int k;
        for (k = 1; k >= 0; --k) {
                oss_dsp_stream_t *str = &dsp->streams[k];
                snd_pcm_t *pcm = str->pcm;
                snd_pcm_hw_params_t hw;
-               snd_pcm_sw_params_t sw;
                int format;
                int err;
                if (!pcm)
@@ -246,6 +245,20 @@ static int oss_dsp_params(oss_dsp_t *dsp)
                str->period_size = snd_pcm_hw_param_value(&hw, SND_PCM_HW_PARAM_PERIOD_SIZE, 0);
                str->periods = snd_pcm_hw_param_value(&hw, SND_PCM_HW_PARAM_PERIODS, 0);
                str->buffer_size = str->periods * str->period_size;
+       }
+       return 0;
+}
+
+static int oss_dsp_sw_params(oss_dsp_t *dsp)
+{
+       int k;
+       for (k = 1; k >= 0; --k) {
+               oss_dsp_stream_t *str = &dsp->streams[k];
+               snd_pcm_t *pcm = str->pcm;
+               snd_pcm_sw_params_t sw;
+               int err;
+               if (!pcm)
+                       continue;
                snd_pcm_sw_params_current(pcm, &sw);
                if (str->disabled)
                        snd_pcm_sw_param_set(pcm, &sw, 
@@ -271,13 +284,22 @@ static int oss_dsp_params(oss_dsp_t *dsp)
                if (err < 0)
                        return err;
                str->boundary = sw.boundary;
-               err = snd_pcm_prepare(pcm);
-               if (err < 0)
-                       return err;
        }
        return 0;
 }
 
+static int oss_dsp_params(oss_dsp_t *dsp)
+{
+       int err;
+       err = oss_dsp_hw_params(dsp);
+       if (err < 0) 
+               return err;
+       err = oss_dsp_sw_params(dsp);
+       if (err < 0) 
+               return err;
+       return 0;
+}
+
 static int oss_dsp_close(int fd)
 {
        int result = 0;
@@ -689,13 +711,12 @@ static int oss_dsp_ioctl(int fd, unsigned long cmd, ...)
                if (pcm) {
                        if (result & PCM_ENABLE_INPUT) {
                                str->disabled = 0;
-                               if (oss_dsp_params(dsp) >= 0 &&
-                                   snd_pcm_prepare(pcm) >= 0)
+                               if (oss_dsp_sw_params(dsp) >= 0)
                                        snd_pcm_start(pcm);
                        } else {
                                str->disabled = 1;
                                if (snd_pcm_drop(pcm) >= 0)
-                                       oss_dsp_params(dsp);                            
+                                       oss_dsp_sw_params(dsp);                         
                        }
                }
                str = &dsp->streams[SND_PCM_STREAM_PLAYBACK];
@@ -703,13 +724,12 @@ static int oss_dsp_ioctl(int fd, unsigned long cmd, ...)
                if (pcm) {
                        if (result & PCM_ENABLE_OUTPUT) {
                                str->disabled = 0;
-                               if (oss_dsp_params(dsp) >= 0 &&
-                                   snd_pcm_prepare(pcm) >= 0)
+                               if (oss_dsp_sw_params(dsp) >= 0)
                                        snd_pcm_start(pcm);
                        } else {
                                str->disabled = 1;
                                if (snd_pcm_drop(pcm) >= 0)
-                                       oss_dsp_params(dsp);                            
+                                       oss_dsp_sw_params(dsp);                         
                        }
                }
                return 0;