Gerald Pfeifer gerald@pfeifer.com writes:
Tests by a FreeBSD user and discussions with one of the FreeBSD sound maintainers confirmed that this is the right fix for that platform.
I'm not sure whether you want to make this change in general, for all platforms, so for now I have embedded it in an #if(n)def.
I think we should do that on all platforms, yes. And you probably want to fix OSS_WaveInInit too.
On Tue, 30 Dec 2003, Alexandre Julliard wrote:
I'm not sure whether you want to make this change in general, for all platforms, so for now I have embedded it in an #if(n)def.
I think we should do that on all platforms, yes. And you probably want to fix OSS_WaveInInit too.
Good catch! As promised, please find an updated patch below.
Gerald
ChangeLog: Improve error messages in OSS_WaveOutInit() and OSS_WaveInInit() and warn instead of aborting in case of problems reading mixer info. This makes sound work on FreeBSD. Index: audio.c =================================================================== RCS file: /home/wine/wine/dlls/winmm/wineoss/audio.c,v retrieving revision 1.108 diff -u -3 -p -r1.108 audio.c --- audio.c 12 Dec 2003 05:55:26 -0000 1.108 +++ audio.c 31 Dec 2003 15:52:05 -0000 @@ -538,17 +538,18 @@ static BOOL OSS_WaveOutInit(OSS_DEVICE* if ((mixer = open(ossdev->mixer_name, O_RDONLY|O_NDELAY)) >= 0) { mixer_info info; if (ioctl(mixer, SOUND_MIXER_INFO, &info) >= 0) { - close(mixer); strncpy(ossdev->ds_desc.szDesc, info.name, sizeof(info.name)); strcpy(ossdev->ds_desc.szDrvName, "wineoss.drv"); strncpy(ossdev->out_caps.szPname, info.name, sizeof(info.name)); TRACE("%s\n", ossdev->ds_desc.szDesc); } else { - ERR("%s: can't read info!\n", ossdev->mixer_name); - OSS_CloseDevice(ossdev); - close(mixer); - return FALSE; + /* FreeBSD up to at least 5.2 provides this ioctl, but does not + * implement it properly, and there are probably similar issues + * on other platforms, so we warn but try to go ahead. + */ + WARN("%s: cannot read SOUND_MIXER_INFO!\n", ossdev->mixer_name); } + close(mixer); } else { ERR("%s: %s\n", ossdev->mixer_name , strerror( errno )); OSS_CloseDevice(ossdev); @@ -680,15 +681,16 @@ static BOOL OSS_WaveInInit(OSS_DEVICE* o if ((mixer = open(ossdev->mixer_name, O_RDONLY|O_NDELAY)) >= 0) { mixer_info info; if (ioctl(mixer, SOUND_MIXER_INFO, &info) >= 0) { - close(mixer); strncpy(ossdev->in_caps.szPname, info.name, sizeof(info.name)); TRACE("%s\n", ossdev->ds_desc.szDesc); } else { - ERR("%s: can't read info!\n", ossdev->mixer_name); - OSS_CloseDevice(ossdev); - close(mixer); - return FALSE; + /* FreeBSD up to at least 5.2 provides this ioctl, but does not + * implement it properly, and there are probably similar issues + * on other platforms, so we warn but try to go ahead. + */ + WARN("%s: cannot read SOUND_MIXER_INFO!\n", ossdev->mixer_name); } + close(mixer); } else { ERR("%s: %s\n", ossdev->mixer_name, strerror(errno)); OSS_CloseDevice(ossdev);