Patchwork [resend,STABLE] Sync OSS_GETVERSION handling with head

login
register
mail settings
Submitter Juergen Lock
Date April 11, 2010, 4:17 p.m.
Message ID <20100411161732.GA2221@triton8.kn-bremen.de>
Download mbox | patch
Permalink /patch/49916/
State New
Headers show

Comments

Juergen Lock - April 11, 2010, 4:17 p.m.
As suggested by Andreas Färber, here is a cumulative patch that syncs
OSS_GETVERSION handling with head by merging the following commits:

1. oss: issue OSS_GETVERSION ioctl only when needed
   6d246526ce3c145b2831285def6983f5de6190d3

2. oss: fix fragment setting
   3d709fe73a77c40e263b3af6e650fd4b519c3562

3. Workaround for broken OSS_GETVERSION on FreeBSD, part two
   72ff25e4e98d6dba9286d032b9ff5432553bbad5

Signed-off-by: Juergen Lock <nox@jelal.kn-bremen.de>
Aurelien Jarno - April 18, 2010, 8:52 p.m.
On Sun, Apr 11, 2010 at 06:17:32PM +0200, Juergen Lock wrote:
> As suggested by Andreas Färber, here is a cumulative patch that syncs
> OSS_GETVERSION handling with head by merging the following commits:
> 
> 1. oss: issue OSS_GETVERSION ioctl only when needed
>    6d246526ce3c145b2831285def6983f5de6190d3
> 
> 2. oss: fix fragment setting
>    3d709fe73a77c40e263b3af6e650fd4b519c3562
> 
> 3. Workaround for broken OSS_GETVERSION on FreeBSD, part two
>    72ff25e4e98d6dba9286d032b9ff5432553bbad5
> 
> Signed-off-by: Juergen Lock <nox@jelal.kn-bremen.de>

I would actually prefer a patch series instead of a cumulative patch, so
that we can match commits between HEAD and stable-0.12.

Also malc, do you have any comment on that?

> --- a/audio/ossaudio.c
> +++ b/audio/ossaudio.c
> @@ -38,6 +38,10 @@
>  #define AUDIO_CAP "oss"
>  #include "audio_int.h"
>  
> +#if defined OSS_GETVERSION && defined SNDCTL_DSP_POLICY
> +#define USE_DSP_POLICY
> +#endif
> +
>  typedef struct OSSVoiceOut {
>      HWVoiceOut hw;
>      void *pcm_buf;
> @@ -236,14 +240,39 @@ static void oss_dump_info (struct oss_pa
>  }
>  #endif
>  
> +#ifdef USE_DSP_POLICY
> +static int oss_get_version (int fd, int *version, const char *typ)
> +{
> +    if (ioctl (fd, OSS_GETVERSION, &version)) {
> +#if defined(__FreeBSD__) || defined(__FreeBSD_kernel__)
> +        /*
> +         * Looks like atm (20100109) FreeBSD knows OSS_GETVERSION
> +         * since 7.x, but currently only on the mixer device (or in
> +         * the Linuxolator), and in the native version that part of
> +         * the code is in fact never reached so the ioctl fails anyway.
> +         * Until this is fixed, just check the errno and if its what
> +         * FreeBSD's sound drivers return atm assume they are new enough.
> +         */
> +        if (errno == EINVAL) {
> +            *version = 0x040000;
> +            return 0;
> +        }
> +#endif
> +        oss_logerr2 (errno, typ, "Failed to get OSS version\n");
> +        return -1;
> +    }
> +    return 0;
> +}
> +#endif
> +
>  static int oss_open (int in, struct oss_params *req,
>                       struct oss_params *obt, int *pfd)
>  {
>      int fd;
> -    int version;
>      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";
>  
> @@ -281,27 +310,30 @@ static int oss_open (int in, struct oss_
>          goto err;
>      }
>  
> -    if (ioctl (fd, OSS_GETVERSION, &version)) {
> -        oss_logerr2 (errno, typ, "Failed to get OSS version\n");
> -        version = 0;
> -    }
> +#ifdef USE_DSP_POLICY
> +    if (conf.policy >= 0) {
> +        int version;
>  
> -    if (conf.debug) {
> -        dolog ("OSS version = %#x\n", version);
> -    }
> +        if (!oss_get_version (fd, &version, typ)) {
> +            if (conf.debug) {
> +                dolog ("OSS version = %#x\n", version);
> +            }
>  
> -#ifdef SNDCTL_DSP_POLICY
> -    if (conf.policy >= 0 && 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",
> @@ -857,7 +889,7 @@ static struct audio_option oss_options[]
>          .valp  = &conf.exclusive,
>          .descr = "Open device in exclusive mode (vmix wont work)"
>      },
> -#ifdef SNDCTL_DSP_POLICY
> +#ifdef USE_DSP_POLICY
>      {
>          .name  = "POLICY",
>          .tag   = AUD_OPT_INT,
> 
> 
>
Juergen Lock - April 18, 2010, 9:16 p.m.
On Sun, Apr 18, 2010 at 10:52:22PM +0200, Aurelien Jarno wrote:
> On Sun, Apr 11, 2010 at 06:17:32PM +0200, Juergen Lock wrote:
> > As suggested by Andreas Färber, here is a cumulative patch that syncs
> > OSS_GETVERSION handling with head by merging the following commits:
> > 
> > 1. oss: issue OSS_GETVERSION ioctl only when needed
> >    6d246526ce3c145b2831285def6983f5de6190d3
> > 
> > 2. oss: fix fragment setting
> >    3d709fe73a77c40e263b3af6e650fd4b519c3562
> > 
> > 3. Workaround for broken OSS_GETVERSION on FreeBSD, part two
> >    72ff25e4e98d6dba9286d032b9ff5432553bbad5
> > 
> > Signed-off-by: Juergen Lock <nox@jelal.kn-bremen.de>
> 
> I would actually prefer a patch series instead of a cumulative patch, so
> that we can match commits between HEAD and stable-0.12.
> 
Oh, I only did what was suggested...  If you want to merge those as
individual commits I think you can just cherry-pick them from head?

> Also malc, do you have any comment on that?

 Last time he approved (with some delay), it just never got committed.

 Cheers,
	Juergen
Aurelien Jarno - April 18, 2010, 9:38 p.m.
On Sun, Apr 18, 2010 at 11:16:46PM +0200, Juergen Lock wrote:
> On Sun, Apr 18, 2010 at 10:52:22PM +0200, Aurelien Jarno wrote:
> > On Sun, Apr 11, 2010 at 06:17:32PM +0200, Juergen Lock wrote:
> > > As suggested by Andreas Färber, here is a cumulative patch that syncs
> > > OSS_GETVERSION handling with head by merging the following commits:
> > > 
> > > 1. oss: issue OSS_GETVERSION ioctl only when needed
> > >    6d246526ce3c145b2831285def6983f5de6190d3
> > > 
> > > 2. oss: fix fragment setting
> > >    3d709fe73a77c40e263b3af6e650fd4b519c3562
> > > 
> > > 3. Workaround for broken OSS_GETVERSION on FreeBSD, part two
> > >    72ff25e4e98d6dba9286d032b9ff5432553bbad5
> > > 
> > > Signed-off-by: Juergen Lock <nox@jelal.kn-bremen.de>
> > 
> > I would actually prefer a patch series instead of a cumulative patch, so
> > that we can match commits between HEAD and stable-0.12.
> > 
> Oh, I only did what was suggested...  If you want to merge those as
> individual commits I think you can just cherry-pick them from head?
> 

They doesn't apply directly, and fixing them doesn't seems that
trivial.
Juergen Lock - April 18, 2010, 9:52 p.m.
On Sun, Apr 18, 2010 at 11:38:34PM +0200, Aurelien Jarno wrote:
> On Sun, Apr 18, 2010 at 11:16:46PM +0200, Juergen Lock wrote:
> > On Sun, Apr 18, 2010 at 10:52:22PM +0200, Aurelien Jarno wrote:
> > > On Sun, Apr 11, 2010 at 06:17:32PM +0200, Juergen Lock wrote:
> > > > As suggested by Andreas Färber, here is a cumulative patch that syncs
> > > > OSS_GETVERSION handling with head by merging the following commits:
> > > > 
> > > > 1. oss: issue OSS_GETVERSION ioctl only when needed
> > > >    6d246526ce3c145b2831285def6983f5de6190d3
> > > > 
> > > > 2. oss: fix fragment setting
> > > >    3d709fe73a77c40e263b3af6e650fd4b519c3562
> > > > 
> > > > 3. Workaround for broken OSS_GETVERSION on FreeBSD, part two
> > > >    72ff25e4e98d6dba9286d032b9ff5432553bbad5
> > > > 
> > > > Signed-off-by: Juergen Lock <nox@jelal.kn-bremen.de>
> > > 
> > > I would actually prefer a patch series instead of a cumulative patch, so
> > > that we can match commits between HEAD and stable-0.12.
> > > 
> > Oh, I only did what was suggested...  If you want to merge those as
> > individual commits I think you can just cherry-pick them from head?
> > 
> 
> They doesn't apply directly, and fixing them doesn't seems that
> trivial.

Oh, I must have completely forgot about that then. :(  I'll see what
I can do over the next few days...

 Cheers,
	Juergen
Andreas Färber - April 18, 2010, 11:03 p.m.
Am 18.04.2010 um 22:52 schrieb Aurelien Jarno:

> On Sun, Apr 11, 2010 at 06:17:32PM +0200, Juergen Lock wrote:
>> As suggested by Andreas Färber, here is a cumulative patch that syncs
>> OSS_GETVERSION handling with head by merging the following commits:
>>
>> 1. oss: issue OSS_GETVERSION ioctl only when needed
>>   6d246526ce3c145b2831285def6983f5de6190d3
>>
>> 2. oss: fix fragment setting
>>   3d709fe73a77c40e263b3af6e650fd4b519c3562
>>
>> 3. Workaround for broken OSS_GETVERSION on FreeBSD, part two
>>   72ff25e4e98d6dba9286d032b9ff5432553bbad5
>>
>> Signed-off-by: Juergen Lock <nox@jelal.kn-bremen.de>
>
> I would actually prefer a patch series instead of a cumulative  
> patch, so
> that we can match commits between HEAD and stable-0.12.

I had suggested it to avoid applying known-broken commits to the  
stable branch as part of the series. I don't care too much about  
Stable though.

Andreas
malc - April 19, 2010, 7:30 a.m.
On Sun, 18 Apr 2010, Aurelien Jarno wrote:

> On Sun, Apr 11, 2010 at 06:17:32PM +0200, Juergen Lock wrote:
> > As suggested by Andreas F?rber, here is a cumulative patch that syncs
> > OSS_GETVERSION handling with head by merging the following commits:
> > 
> > 1. oss: issue OSS_GETVERSION ioctl only when needed
> >    6d246526ce3c145b2831285def6983f5de6190d3
> > 
> > 2. oss: fix fragment setting
> >    3d709fe73a77c40e263b3af6e650fd4b519c3562
> > 
> > 3. Workaround for broken OSS_GETVERSION on FreeBSD, part two
> >    72ff25e4e98d6dba9286d032b9ff5432553bbad5
> > 
> > Signed-off-by: Juergen Lock <nox@jelal.kn-bremen.de>
> 
> I would actually prefer a patch series instead of a cumulative patch, so
> that we can match commits between HEAD and stable-0.12.
> 
> Also malc, do you have any comment on that?

I don't get this: what is that i need to comment on? The patches were
commited to master, so i don't have anything against them.

> 
> > --- a/audio/ossaudio.c
> > +++ b/audio/ossaudio.c
> > @@ -38,6 +38,10 @@
> >  #define AUDIO_CAP "oss"
> >  #include "audio_int.h"
> >  
> > +#if defined OSS_GETVERSION && defined SNDCTL_DSP_POLICY
> > +#define USE_DSP_POLICY
> > +#endif
> > +
> >  typedef struct OSSVoiceOut {
> >      HWVoiceOut hw;
> >      void *pcm_buf;
> > @@ -236,14 +240,39 @@ static void oss_dump_info (struct oss_pa
> >  }
> >  #endif
> >  
> > +#ifdef USE_DSP_POLICY
> > +static int oss_get_version (int fd, int *version, const char *typ)
> > +{
> > +    if (ioctl (fd, OSS_GETVERSION, &version)) {
> > +#if defined(__FreeBSD__) || defined(__FreeBSD_kernel__)
> > +        /*
> > +         * Looks like atm (20100109) FreeBSD knows OSS_GETVERSION
> > +         * since 7.x, but currently only on the mixer device (or in
> > +         * the Linuxolator), and in the native version that part of
> > +         * the code is in fact never reached so the ioctl fails anyway.
> > +         * Until this is fixed, just check the errno and if its what
> > +         * FreeBSD's sound drivers return atm assume they are new enough.
> > +         */
> > +        if (errno == EINVAL) {
> > +            *version = 0x040000;
> > +            return 0;
> > +        }
> > +#endif
> > +        oss_logerr2 (errno, typ, "Failed to get OSS version\n");
> > +        return -1;
> > +    }
> > +    return 0;
> > +}
> > +#endif
> > +
> >  static int oss_open (int in, struct oss_params *req,
> >                       struct oss_params *obt, int *pfd)
> >  {
> >      int fd;
> > -    int version;
> >      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";
> >  
> > @@ -281,27 +310,30 @@ static int oss_open (int in, struct oss_
> >          goto err;
> >      }
> >  
> > -    if (ioctl (fd, OSS_GETVERSION, &version)) {
> > -        oss_logerr2 (errno, typ, "Failed to get OSS version\n");
> > -        version = 0;
> > -    }
> > +#ifdef USE_DSP_POLICY
> > +    if (conf.policy >= 0) {
> > +        int version;
> >  
> > -    if (conf.debug) {
> > -        dolog ("OSS version = %#x\n", version);
> > -    }
> > +        if (!oss_get_version (fd, &version, typ)) {
> > +            if (conf.debug) {
> > +                dolog ("OSS version = %#x\n", version);
> > +            }
> >  
> > -#ifdef SNDCTL_DSP_POLICY
> > -    if (conf.policy >= 0 && 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",
> > @@ -857,7 +889,7 @@ static struct audio_option oss_options[]
> >          .valp  = &conf.exclusive,
> >          .descr = "Open device in exclusive mode (vmix wont work)"
> >      },
> > -#ifdef SNDCTL_DSP_POLICY
> > +#ifdef USE_DSP_POLICY
> >      {
> >          .name  = "POLICY",
> >          .tag   = AUD_OPT_INT,
> > 
> > 
> > 
> 
>
Aurelien Jarno - April 19, 2010, 8:21 a.m.
malc a écrit :
> On Sun, 18 Apr 2010, Aurelien Jarno wrote:
> 
>> On Sun, Apr 11, 2010 at 06:17:32PM +0200, Juergen Lock wrote:
>>> As suggested by Andreas F?rber, here is a cumulative patch that syncs
>>> OSS_GETVERSION handling with head by merging the following commits:
>>>
>>> 1. oss: issue OSS_GETVERSION ioctl only when needed
>>>    6d246526ce3c145b2831285def6983f5de6190d3
>>>
>>> 2. oss: fix fragment setting
>>>    3d709fe73a77c40e263b3af6e650fd4b519c3562
>>>
>>> 3. Workaround for broken OSS_GETVERSION on FreeBSD, part two
>>>    72ff25e4e98d6dba9286d032b9ff5432553bbad5
>>>
>>> Signed-off-by: Juergen Lock <nox@jelal.kn-bremen.de>
>> I would actually prefer a patch series instead of a cumulative patch, so
>> that we can match commits between HEAD and stable-0.12.
>>
>> Also malc, do you have any comment on that?
> 
> I don't get this: what is that i need to comment on? The patches were
> commited to master, so i don't have anything against them.
> 

Do you think they are fine to commit to stable, do they really fixes
important bugs there?
malc - April 19, 2010, 8:36 a.m.
On Mon, 19 Apr 2010, Aurelien Jarno wrote:

> malc a ?crit :
> > On Sun, 18 Apr 2010, Aurelien Jarno wrote:
> > 
> >> On Sun, Apr 11, 2010 at 06:17:32PM +0200, Juergen Lock wrote:
> >>> As suggested by Andreas F?rber, here is a cumulative patch that syncs
> >>> OSS_GETVERSION handling with head by merging the following commits:
> >>>
> >>> 1. oss: issue OSS_GETVERSION ioctl only when needed
> >>>    6d246526ce3c145b2831285def6983f5de6190d3
> >>>
> >>> 2. oss: fix fragment setting
> >>>    3d709fe73a77c40e263b3af6e650fd4b519c3562
> >>>
> >>> 3. Workaround for broken OSS_GETVERSION on FreeBSD, part two
> >>>    72ff25e4e98d6dba9286d032b9ff5432553bbad5
> >>>
> >>> Signed-off-by: Juergen Lock <nox@jelal.kn-bremen.de>
> >> I would actually prefer a patch series instead of a cumulative patch, so
> >> that we can match commits between HEAD and stable-0.12.
> >>
> >> Also malc, do you have any comment on that?
> > 
> > I don't get this: what is that i need to comment on? The patches were
> > commited to master, so i don't have anything against them.
> > 
> 
> Do you think they are fine to commit to stable, do they really fixes
> important bugs there?
> 

Yes.
Juergen Lock - April 19, 2010, 5:58 p.m.
On Sun, Apr 18, 2010 at 11:52:16PM +0200, Juergen Lock wrote:
> On Sun, Apr 18, 2010 at 11:38:34PM +0200, Aurelien Jarno wrote:
> > On Sun, Apr 18, 2010 at 11:16:46PM +0200, Juergen Lock wrote:
> > > On Sun, Apr 18, 2010 at 10:52:22PM +0200, Aurelien Jarno wrote:
> > > > On Sun, Apr 11, 2010 at 06:17:32PM +0200, Juergen Lock wrote:
> > > > > As suggested by Andreas Färber, here is a cumulative patch that syncs
> > > > > OSS_GETVERSION handling with head by merging the following commits:
> > > > > 
> > > > > 1. oss: issue OSS_GETVERSION ioctl only when needed
> > > > >    6d246526ce3c145b2831285def6983f5de6190d3
> > > > > 
> > > > > 2. oss: fix fragment setting
> > > > >    3d709fe73a77c40e263b3af6e650fd4b519c3562
> > > > > 
> > > > > 3. Workaround for broken OSS_GETVERSION on FreeBSD, part two
> > > > >    72ff25e4e98d6dba9286d032b9ff5432553bbad5
> > > > > 
> > > > > Signed-off-by: Juergen Lock <nox@jelal.kn-bremen.de>
> > > > 
> > > > I would actually prefer a patch series instead of a cumulative patch, so
> > > > that we can match commits between HEAD and stable-0.12.
> > > > 
> > > Oh, I only did what was suggested...  If you want to merge those as
> > > individual commits I think you can just cherry-pick them from head?
> > > 
> > 
> > They doesn't apply directly, and fixing them doesn't seems that
> > trivial.
> 
> Oh, I must have completely forgot about that then. :(  I'll see what
> I can do over the next few days...

Ok found the reason cherry-picking didn't work:  There were two commits
missing at the beginning of the above list (doh!), the correct list is:

1. oss: workaround for cases when OSS_GETVERSION is not defined
   e726fe7d60d46636c74c1c4a8fac7e4a05efb163

2. oss: refactor code around policy setting
   78d9356d3caad95a74bc9cd65eea5fc7e050c35d

3. oss: issue OSS_GETVERSION ioctl only when needed
   6d246526ce3c145b2831285def6983f5de6190d3

4. oss: fix fragment setting
   3d709fe73a77c40e263b3af6e650fd4b519c3562

5. Workaround for broken OSS_GETVERSION on FreeBSD, part two
   72ff25e4e98d6dba9286d032b9ff5432553bbad5

 So with this list you should be able to sync audio/ossaudio.c correctly,
and sorry again about the confusion...

	Juergen

Patch

--- a/audio/ossaudio.c
+++ b/audio/ossaudio.c
@@ -38,6 +38,10 @@ 
 #define AUDIO_CAP "oss"
 #include "audio_int.h"
 
+#if defined OSS_GETVERSION && defined SNDCTL_DSP_POLICY
+#define USE_DSP_POLICY
+#endif
+
 typedef struct OSSVoiceOut {
     HWVoiceOut hw;
     void *pcm_buf;
@@ -236,14 +240,39 @@  static void oss_dump_info (struct oss_pa
 }
 #endif
 
+#ifdef USE_DSP_POLICY
+static int oss_get_version (int fd, int *version, const char *typ)
+{
+    if (ioctl (fd, OSS_GETVERSION, &version)) {
+#if defined(__FreeBSD__) || defined(__FreeBSD_kernel__)
+        /*
+         * Looks like atm (20100109) FreeBSD knows OSS_GETVERSION
+         * since 7.x, but currently only on the mixer device (or in
+         * the Linuxolator), and in the native version that part of
+         * the code is in fact never reached so the ioctl fails anyway.
+         * Until this is fixed, just check the errno and if its what
+         * FreeBSD's sound drivers return atm assume they are new enough.
+         */
+        if (errno == EINVAL) {
+            *version = 0x040000;
+            return 0;
+        }
+#endif
+        oss_logerr2 (errno, typ, "Failed to get OSS version\n");
+        return -1;
+    }
+    return 0;
+}
+#endif
+
 static int oss_open (int in, struct oss_params *req,
                      struct oss_params *obt, int *pfd)
 {
     int fd;
-    int version;
     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";
 
@@ -281,27 +310,30 @@  static int oss_open (int in, struct oss_
         goto err;
     }
 
-    if (ioctl (fd, OSS_GETVERSION, &version)) {
-        oss_logerr2 (errno, typ, "Failed to get OSS version\n");
-        version = 0;
-    }
+#ifdef USE_DSP_POLICY
+    if (conf.policy >= 0) {
+        int version;
 
-    if (conf.debug) {
-        dolog ("OSS version = %#x\n", version);
-    }
+        if (!oss_get_version (fd, &version, typ)) {
+            if (conf.debug) {
+                dolog ("OSS version = %#x\n", version);
+            }
 
-#ifdef SNDCTL_DSP_POLICY
-    if (conf.policy >= 0 && 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",
@@ -857,7 +889,7 @@  static struct audio_option oss_options[]
         .valp  = &conf.exclusive,
         .descr = "Open device in exclusive mode (vmix wont work)"
     },
-#ifdef SNDCTL_DSP_POLICY
+#ifdef USE_DSP_POLICY
     {
         .name  = "POLICY",
         .tag   = AUD_OPT_INT,