From: Anthony Liguori <anthony@codemonkey.ws>
To: Juergen Lock <nox@jelal.kn-bremen.de>
Cc: qemu-devel@nongnu.org
Subject: Re: [Qemu-devel] [PATCH] [For stable-0.12] Sync OSS_GETVERSION handling with head
Date: Tue, 19 Jan 2010 13:33:54 -0600 [thread overview]
Message-ID: <4B560922.3030705@codemonkey.ws> (raw)
In-Reply-To: <20100117172339.GA34350@triton8.kn-bremen.de>
On 01/17/2010 11:23 AM, 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>
>
malc, please Ack.
Regards,
Anthony Liguori
> --- 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,
>
>
>
>
next prev parent reply other threads:[~2010-01-19 19:34 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2010-01-17 17:23 [Qemu-devel] [PATCH] [For stable-0.12] Sync OSS_GETVERSION handling with head Juergen Lock
2010-01-19 19:33 ` Anthony Liguori [this message]
2010-01-19 21:30 ` malc
2010-02-08 20:28 ` Juergen Lock
2010-02-08 21:48 ` malc
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=4B560922.3030705@codemonkey.ws \
--to=anthony@codemonkey.ws \
--cc=nox@jelal.kn-bremen.de \
--cc=qemu-devel@nongnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.