ChangeSet ID: 12636 CVSROOT: /opt/cvs-commit Module name: wine Changes by: julliard@wine.codeweavers.com 2004/06/15 15:25:46 Modified files: dlls/winmm/wineoss: audio.c Log message: Francois Gouget Fix the check for SNDCTL_DSP_GETCAPS so that it is compliant with the OSS specification. Only test the different formats if tracing is on. Patch: http://cvs.winehq.org/patch.py?id=12636 Old revision New revision Changes Path 1.130 1.131 +38 -27 wine/dlls/winmm/wineoss/audio.c Index: wine/dlls/winmm/wineoss/audio.c diff -u -p wine/dlls/winmm/wineoss/audio.c:1.130 wine/dlls/winmm/wineoss/audio.c:1.131 --- wine/dlls/winmm/wineoss/audio.c:1.130 Sat May 25 15:34:08 2013 +++ wine/dlls/winmm/wineoss/audio.c Sat May 25 15:34:08 2013 @@ -869,7 +869,7 @@ static BOOL OSS_WaveInInit(OSS_DEVICE* o ossdev->dsc_caps.dwFormats = 0x00000000; ossdev->dsc_caps.dwChannels = 1; - /* See the comment in OSS_WaveOutInit */ + /* See the comment in OSS_WaveOutInit for the loop order */ for (f=0;f<2;f++) { arg=win_std_oss_fmts[f]; rc=ioctl(ossdev->fd, SNDCTL_DSP_SAMPLESIZE, &arg); @@ -933,46 +933,57 @@ static void OSS_WaveFullDuplexInit(OSS_D int caps; TRACE("(%p) %s\n", ossdev, ossdev->dev_name); - if (OSS_OpenDevice(ossdev, O_RDWR, NULL, 0,-1,-1,-1) != 0) + /* The OSS documentation says we must call SNDCTL_SETDUPLEX + * *before* checking for SNDCTL_DSP_GETCAPS otherwise we may + * get the wrong result. This ioctl must even be done before + * setting the fragment size so that only OSS_RawOpenDevice is + * in a position to do it. So we set full_duplex speculatively + * and adjust right after. + */ + ossdev->full_duplex=1; + rc=OSS_OpenDevice(ossdev, O_RDWR, NULL, 0,-1,-1,-1); + ossdev->full_duplex=0; + if (rc != 0) return; ioctl(ossdev->fd, SNDCTL_DSP_RESET, 0); - TRACE("%s\n", ossdev->ds_desc.szDesc); + + if (ioctl(ossdev->fd, SNDCTL_DSP_GETCAPS, &caps) == 0) + ossdev->full_duplex = (caps & DSP_CAP_DUPLEX); + if (WINE_TRACE_ON(wave)) + { OSS_Info(ossdev->fd); - /* See the comment in OSS_WaveOutInit */ - for (f=0;f<2;f++) { - arg=win_std_oss_fmts[f]; - rc=ioctl(ossdev->fd, SNDCTL_DSP_SAMPLESIZE, &arg); - if (rc!=0 || arg!=win_std_oss_fmts[f]) { - TRACE("DSP_SAMPLESIZE: rc=%d returned 0x%x for 0x%x\n", - rc,arg,win_std_oss_fmts[f]); - continue; - } - - for (c=0;c<2;c++) { - arg=c; - rc=ioctl(ossdev->fd, SNDCTL_DSP_STEREO, &arg); - if (rc!=0 || arg!=c) { - TRACE("DSP_STEREO: rc=%d returned %d for %d\n",rc,arg,c); + /* See the comment in OSS_WaveOutInit for the loop order */ + for (f=0;f<2;f++) { + arg=win_std_oss_fmts[f]; + rc=ioctl(ossdev->fd, SNDCTL_DSP_SAMPLESIZE, &arg); + if (rc!=0 || arg!=win_std_oss_fmts[f]) { + TRACE("DSP_SAMPLESIZE: rc=%d returned 0x%x for 0x%x\n", + rc,arg,win_std_oss_fmts[f]); continue; } - for (r=0;rfd, SNDCTL_DSP_SPEED, &arg); - TRACE("DSP_SPEED: rc=%d returned %d for %dx%dx%d\n", - rc,arg,win_std_rates[r],win_std_oss_fmts[f],c+1); + for (c=0;c<2;c++) { + arg=c; + rc=ioctl(ossdev->fd, SNDCTL_DSP_STEREO, &arg); + if (rc!=0 || arg!=c) { + TRACE("DSP_STEREO: rc=%d returned %d for %d\n",rc,arg,c); + continue; + } + + for (r=0;rfd, SNDCTL_DSP_SPEED, &arg); + TRACE("DSP_SPEED: rc=%d returned %d for %dx%dx%d\n", + rc,arg,win_std_rates[r],win_std_oss_fmts[f],c+1); + } } } } - - if (ioctl(ossdev->fd, SNDCTL_DSP_GETCAPS, &caps) == 0) - ossdev->full_duplex = (caps & DSP_CAP_DUPLEX); - OSS_CloseDevice(ossdev); }