]> rtime.felk.cvut.cz Git - lisovros/qemu_apohw.git/commitdiff
oss: fix fragment setting
authormalc <av1474@comtv.ru>
Sat, 9 Jan 2010 15:06:54 +0000 (18:06 +0300)
committerAurelien Jarno <aurelien@aurel32.net>
Sun, 25 Apr 2010 10:20:10 +0000 (12:20 +0200)
Previous patch introduced subtle regression, in cases when
OSS_GETVERSION fails the code wasn't falling back to
SNDCTL_DSP_SETFRAGMENT.

Signed-off-by: malc <av1474@comtv.ru>
(cherry picked from commit 3d709fe73a77c40e263b3af6e650fd4b519c3562)

audio/ossaudio.c

index 79d1daa1c0d877cfc4ac2a617ca383f1390a8c9e..ebf8b2397f22bfdb3b0551812b8f4bce82311b46 100644 (file)
@@ -247,6 +247,7 @@ static int oss_open (int in, struct oss_params *req,
     int oflags = conf.exclusive ? O_EXCL : 0;
     audio_buf_info abinfo;
     int fmt, freq, nchannels;
+    int setfragment = 1;
     const char *dspname = in ? conf.devpath_in : conf.devpath_out;
     const char *typ = in ? "ADC" : "DAC";
 
@@ -290,25 +291,27 @@ static int oss_open (int in, struct oss_params *req,
 
         if (ioctl (fd, OSS_GETVERSION, &version)) {
             oss_logerr2 (errno, typ, "Failed to get OSS version\n");
-            version = 0;
-        }
-
-        if (conf.debug) {
-            dolog ("OSS version = %#x\n", version);
         }
+        else {
+            if (conf.debug) {
+                dolog ("OSS version = %#x\n", version);
+            }
 
-        if (version >= 0x040000) {
-            int policy = conf.policy;
-            if (ioctl (fd, SNDCTL_DSP_POLICY, &policy)) {
-                oss_logerr2 (errno, typ, "Failed to set timing policy to %d\n",
-                             conf.policy);
-                goto err;
+            if (version >= 0x040000) {
+                int policy = conf.policy;
+                if (ioctl (fd, SNDCTL_DSP_POLICY, &policy)) {
+                    oss_logerr2 (errno, typ,
+                                 "Failed to set timing policy to %d\n",
+                                 conf.policy);
+                    goto err;
+                }
+                setfragment = 0;
             }
         }
     }
-    else
 #endif
-    {
+
+    if (setfragment) {
         int mmmmssss = (req->nfrags << 16) | ctz32 (req->fragsize);
         if (ioctl (fd, SNDCTL_DSP_SETFRAGMENT, &mmmmssss)) {
             oss_logerr2 (errno, typ, "Failed to set buffer length (%d, %d)\n",