wineoss: Seperate wave-in and wave-outs shared use of a single OSS_DEVICE struct.

This commit is contained in:
Maarten Lankhorst 2007-10-01 09:16:59 +02:00 committed by Alexandre Julliard
parent 847d5565fc
commit 58e26451db
4 changed files with 184 additions and 188 deletions

View File

@ -82,7 +82,6 @@ WINE_DEFAULT_DEBUG_CHANNEL(wave);
#ifdef HAVE_OSS
OSS_DEVICE OSS_Devices[MAX_WAVEDRV];
WINE_WAVEOUT WOutDev[MAX_WAVEDRV];
WINE_WAVEIN WInDev[MAX_WAVEDRV];
unsigned numOutDev;
@ -184,17 +183,17 @@ static DWORD wodDevInterfaceSize(UINT wDevID, LPDWORD dwParam1)
{
TRACE("(%u, %p)\n", wDevID, dwParam1);
*dwParam1 = MultiByteToWideChar(CP_ACP, 0, WOutDev[wDevID].ossdev->interface_name, -1,
*dwParam1 = MultiByteToWideChar(CP_ACP, 0, WOutDev[wDevID].ossdev.interface_name, -1,
NULL, 0 ) * sizeof(WCHAR);
return MMSYSERR_NOERROR;
}
static DWORD wodDevInterface(UINT wDevID, PWCHAR dwParam1, DWORD dwParam2)
{
if (dwParam2 >= MultiByteToWideChar(CP_ACP, 0, WOutDev[wDevID].ossdev->interface_name, -1,
if (dwParam2 >= MultiByteToWideChar(CP_ACP, 0, WOutDev[wDevID].ossdev.interface_name, -1,
NULL, 0 ) * sizeof(WCHAR))
{
MultiByteToWideChar(CP_ACP, 0, WOutDev[wDevID].ossdev->interface_name, -1,
MultiByteToWideChar(CP_ACP, 0, WOutDev[wDevID].ossdev.interface_name, -1,
dwParam1, dwParam2 / sizeof(WCHAR));
return MMSYSERR_NOERROR;
}
@ -206,17 +205,17 @@ static DWORD widDevInterfaceSize(UINT wDevID, LPDWORD dwParam1)
{
TRACE("(%u, %p)\n", wDevID, dwParam1);
*dwParam1 = MultiByteToWideChar(CP_ACP, 0, WInDev[wDevID].ossdev->interface_name, -1,
*dwParam1 = MultiByteToWideChar(CP_ACP, 0, WInDev[wDevID].ossdev.interface_name, -1,
NULL, 0 ) * sizeof(WCHAR);
return MMSYSERR_NOERROR;
}
static DWORD widDevInterface(UINT wDevID, PWCHAR dwParam1, DWORD dwParam2)
{
if (dwParam2 >= MultiByteToWideChar(CP_ACP, 0, WInDev[wDevID].ossdev->interface_name, -1,
if (dwParam2 >= MultiByteToWideChar(CP_ACP, 0, WInDev[wDevID].ossdev.interface_name, -1,
NULL, 0 ) * sizeof(WCHAR))
{
MultiByteToWideChar(CP_ACP, 0, WInDev[wDevID].ossdev->interface_name, -1,
MultiByteToWideChar(CP_ACP, 0, WInDev[wDevID].ossdev.interface_name, -1,
dwParam1, dwParam2 / sizeof(WCHAR));
return MMSYSERR_NOERROR;
}
@ -1152,46 +1151,46 @@ LRESULT OSS_WaveInit(void)
char* str;
int i;
TRACE("()\n");
FIXME("() stub\n");
str=getenv("AUDIODEV");
if (str!=NULL)
{
OSS_Devices[0].dev_name=StrDup(str,"");
OSS_Devices[0].mixer_name=StrDup(getenv("MIXERDEV"),"/dev/mixer");
WOutDev[0].ossdev.dev_name = WInDev[0].ossdev.dev_name = StrDup(str,"");
WOutDev[0].ossdev.mixer_name = WInDev[0].ossdev.mixer_name = StrDup(getenv("MIXERDEV"),"/dev/mixer");
for (i = 1; i < MAX_WAVEDRV; ++i)
{
OSS_Devices[i].dev_name=StrDup("",NULL);
OSS_Devices[i].mixer_name=StrDup("",NULL);
WOutDev[i].ossdev.dev_name = WInDev[i].ossdev.dev_name = StrDup("",NULL);
WOutDev[i].ossdev.mixer_name = WInDev[i].ossdev.mixer_name = StrDup("",NULL);
}
}
else
{
OSS_Devices[0].dev_name=StrDup("/dev/dsp",NULL);
OSS_Devices[0].mixer_name=StrDup("/dev/mixer",NULL);
WOutDev[0].ossdev.dev_name = WInDev[0].ossdev.dev_name = StrDup("/dev/dsp",NULL);
WOutDev[0].ossdev.mixer_name = WInDev[0].ossdev.mixer_name = StrDup("/dev/mixer",NULL);
for (i = 1; i < MAX_WAVEDRV; ++i)
{
OSS_Devices[i].dev_name=HeapAlloc(GetProcessHeap(),0,11);
sprintf(OSS_Devices[i].dev_name, "/dev/dsp%d", i);
OSS_Devices[i].mixer_name=HeapAlloc(GetProcessHeap(),0,13);
sprintf(OSS_Devices[i].mixer_name, "/dev/mixer%d", i);
WOutDev[i].ossdev.dev_name = WInDev[i].ossdev.dev_name = HeapAlloc(GetProcessHeap(),0,11);
sprintf(WOutDev[i].ossdev.dev_name, "/dev/dsp%d", i);
WOutDev[i].ossdev.mixer_name = WInDev[i].ossdev.mixer_name = HeapAlloc(GetProcessHeap(),0,13);
sprintf(WOutDev[i].ossdev.mixer_name, "/dev/mixer%d", i);
}
}
for (i = 0; i < MAX_WAVEDRV; ++i)
{
OSS_Devices[i].interface_name=HeapAlloc(GetProcessHeap(),0,9+strlen(OSS_Devices[i].dev_name)+1);
sprintf(OSS_Devices[i].interface_name, "wineoss: %s", OSS_Devices[i].dev_name);
WOutDev[i].ossdev.interface_name = WInDev[i].ossdev.interface_name =
HeapAlloc(GetProcessHeap(),0,9+strlen(WOutDev[i].ossdev.dev_name)+1);
sprintf(WOutDev[i].ossdev.interface_name, "wineoss: %s", WOutDev[i].ossdev.dev_name);
}
/* start with output devices */
for (i = 0; i < MAX_WAVEDRV; ++i)
{
if (*OSS_Devices[i].dev_name=='\0' || OSS_WaveOutInit(&OSS_Devices[i]))
if (*WOutDev[i].ossdev.dev_name == '\0' || OSS_WaveOutInit(&WOutDev[i].ossdev))
{
WOutDev[numOutDev].state = WINE_WS_CLOSED;
WOutDev[numOutDev].ossdev = &OSS_Devices[i];
WOutDev[numOutDev].volume = 0xffffffff;
WOutDev[numOutDev].volume = 0xffffffff;
numOutDev++;
}
}
@ -1199,29 +1198,28 @@ LRESULT OSS_WaveInit(void)
/* then do input devices */
for (i = 0; i < MAX_WAVEDRV; ++i)
{
if (*OSS_Devices[i].dev_name=='\0' || OSS_WaveInInit(&OSS_Devices[i]))
if (*WInDev[i].ossdev.dev_name=='\0' || OSS_WaveInInit(&WInDev[i].ossdev))
{
WInDev[numInDev].state = WINE_WS_CLOSED;
WInDev[numInDev].ossdev = &OSS_Devices[i];
numInDev++;
}
}
/* finish with the full duplex bits */
for (i = 0; i < MAX_WAVEDRV; i++)
if (*OSS_Devices[i].dev_name!='\0')
OSS_WaveFullDuplexInit(&OSS_Devices[i]);
if (*WOutDev[i].ossdev.dev_name!='\0')
OSS_WaveFullDuplexInit(&WOutDev[i].ossdev);
TRACE("%d wave out devices\n", numOutDev);
for (i = 0; i < numOutDev; i++) {
TRACE("%d: %s, %s, %s\n", i, WOutDev[i].ossdev->dev_name,
WOutDev[i].ossdev->mixer_name, WOutDev[i].ossdev->interface_name);
TRACE("%d: %s, %s, %s\n", i, WOutDev[i].ossdev.dev_name,
WOutDev[i].ossdev.mixer_name, WOutDev[i].ossdev.interface_name);
}
TRACE("%d wave in devices\n", numInDev);
for (i = 0; i < numInDev; i++) {
TRACE("%d: %s, %s, %s\n", i, WInDev[i].ossdev->dev_name,
WInDev[i].ossdev->mixer_name, WInDev[i].ossdev->interface_name);
TRACE("%d: %s, %s, %s\n", i, WInDev[i].ossdev.dev_name,
WInDev[i].ossdev.mixer_name, WInDev[i].ossdev.interface_name);
}
return 0;
@ -1239,12 +1237,11 @@ LRESULT OSS_WaveExit(void)
for (i = 0; i < MAX_WAVEDRV; ++i)
{
HeapFree(GetProcessHeap(), 0, OSS_Devices[i].dev_name);
HeapFree(GetProcessHeap(), 0, OSS_Devices[i].mixer_name);
HeapFree(GetProcessHeap(), 0, OSS_Devices[i].interface_name);
HeapFree(GetProcessHeap(), 0, WOutDev[i].ossdev.dev_name);
HeapFree(GetProcessHeap(), 0, WOutDev[i].ossdev.mixer_name);
HeapFree(GetProcessHeap(), 0, WOutDev[i].ossdev.interface_name);
}
ZeroMemory(OSS_Devices, sizeof(OSS_Devices));
ZeroMemory(WOutDev, sizeof(WOutDev));
ZeroMemory(WInDev, sizeof(WInDev));
@ -1459,8 +1456,8 @@ static BOOL wodUpdatePlayedTotal(WINE_WAVEOUT* wwo, audio_buf_info* info)
DWORD notplayed;
if (!info) info = &dspspace;
if (ioctl(wwo->ossdev->fd, SNDCTL_DSP_GETOSPACE, info) < 0) {
ERR("ioctl(%s, SNDCTL_DSP_GETOSPACE) failed (%s)\n", wwo->ossdev->dev_name, strerror(errno));
if (ioctl(wwo->ossdev.fd, SNDCTL_DSP_GETOSPACE, info) < 0) {
ERR("ioctl(%s, SNDCTL_DSP_GETOSPACE) failed (%s)\n", wwo->ossdev.dev_name, strerror(errno));
return FALSE;
}
@ -1478,7 +1475,7 @@ static BOOL wodUpdatePlayedTotal(WINE_WAVEOUT* wwo, audio_buf_info* info)
}
else
/* Some OSS drivers will clean up nicely if given a POST, so give 'em the chance... */
ioctl(wwo->ossdev->fd, SNDCTL_DSP_POST, 0);
ioctl(wwo->ossdev.fd, SNDCTL_DSP_POST, 0);
}
wwo->dwPlayedTotal = wwo->dwWrittenTotal - notplayed;
@ -1608,9 +1605,9 @@ static BOOL wodPlayer_WriteMaxFrags(WINE_WAVEOUT* wwo, DWORD* bytes)
if (toWrite > 0)
{
written = write(wwo->ossdev->fd, wwo->lpPlayPtr->lpData + wwo->dwPartialOffset, toWrite);
written = write(wwo->ossdev.fd, wwo->lpPlayPtr->lpData + wwo->dwPartialOffset, toWrite);
if (written <= 0) {
TRACE("write(%s, %p, %d) failed (%s) returned %d\n", wwo->ossdev->dev_name,
TRACE("write(%s, %p, %d) failed (%s) returned %d\n", wwo->ossdev.dev_name,
wwo->lpPlayPtr->lpData + wwo->dwPartialOffset, toWrite, strerror(errno), written);
return FALSE;
}
@ -1699,7 +1696,7 @@ static void wodPlayer_Reset(WINE_WAVEOUT* wwo, BOOL reset)
wodPlayer_NotifyCompletions(wwo, FALSE);
/* flush all possible output */
if (OSS_ResetDevice(wwo->ossdev) != MMSYSERR_NOERROR)
if (OSS_ResetDevice(&wwo->ossdev) != MMSYSERR_NOERROR)
{
wwo->hThread = 0;
wwo->state = WINE_WS_STOPPED;
@ -1868,7 +1865,7 @@ static DWORD wodPlayer_FeedDSP(WINE_WAVEOUT* wwo)
/* OSS doesn't start before it gets either 2 fragments or a SNDCTL_DSP_POST;
* if it didn't get one, we give it the other */
if (wwo->dwBufferSize < availInQ + 2 * wwo->dwFragmentSize)
ioctl(wwo->ossdev->fd, SNDCTL_DSP_POST, 0);
ioctl(wwo->ossdev.fd, SNDCTL_DSP_POST, 0);
wwo->bNeedPost = FALSE;
}
}
@ -1913,7 +1910,7 @@ static DWORD CALLBACK wodPlayer(LPVOID pmt)
wodPlayer_ProcessMessages(wwo);
if (!wwo->lpPlayPtr) {
TRACE("flushing\n");
ioctl(wwo->ossdev->fd, SNDCTL_DSP_SYNC, 0);
ioctl(wwo->ossdev.fd, SNDCTL_DSP_SYNC, 0);
wwo->dwPlayedTotal = wwo->dwWrittenTotal;
dwNextNotifyTime = wodPlayer_NotifyCompletions(wwo, FALSE);
} else {
@ -1944,10 +1941,10 @@ static DWORD wodGetDevCaps(WORD wDevID, LPWAVEOUTCAPSW lpCaps, DWORD dwSize)
return MMSYSERR_BADDEVICEID;
}
if (WOutDev[wDevID].ossdev->open_access == O_RDWR)
memcpy(lpCaps, &WOutDev[wDevID].ossdev->duplex_out_caps, min(dwSize, sizeof(*lpCaps)));
if (WOutDev[wDevID].ossdev.open_access == O_RDWR)
memcpy(lpCaps, &WOutDev[wDevID].ossdev.duplex_out_caps, min(dwSize, sizeof(*lpCaps)));
else
memcpy(lpCaps, &WOutDev[wDevID].ossdev->out_caps, min(dwSize, sizeof(*lpCaps)));
memcpy(lpCaps, &WOutDev[wDevID].ossdev.out_caps, min(dwSize, sizeof(*lpCaps)));
return MMSYSERR_NOERROR;
}
@ -1998,12 +1995,12 @@ DWORD wodOpen(WORD wDevID, LPWAVEOPENDESC lpDesc, DWORD dwFlags)
wwo = &WOutDev[wDevID];
if ((dwFlags & WAVE_DIRECTSOUND) &&
!(wwo->ossdev->duplex_out_caps.dwSupport & WAVECAPS_DIRECTSOUND))
!(wwo->ossdev.duplex_out_caps.dwSupport & WAVECAPS_DIRECTSOUND))
/* not supported, ignore it */
dwFlags &= ~WAVE_DIRECTSOUND;
if (dwFlags & WAVE_DIRECTSOUND) {
if (wwo->ossdev->duplex_out_caps.dwSupport & WAVECAPS_SAMPLEACCURATE)
if (wwo->ossdev.duplex_out_caps.dwSupport & WAVECAPS_SAMPLEACCURATE)
/* we have realtime DirectSound, fragments just waste our time,
* but a large buffer is good, so choose 64KB (32 * 2^11) */
audio_fragment = 0x0020000B;
@ -2034,7 +2031,7 @@ DWORD wodOpen(WORD wDevID, LPWAVEOPENDESC lpDesc, DWORD dwFlags)
/* we want to be able to mmap() the device, which means it must be opened readable,
* otherwise mmap() will fail (at least under Linux) */
ret = OSS_OpenDevice(wwo->ossdev,
ret = OSS_OpenDevice(&wwo->ossdev,
(dwFlags & WAVE_DIRECTSOUND) ? O_RDWR : O_WRONLY,
&audio_fragment,
(dwFlags & WAVE_DIRECTSOUND) ? 0 : 1,
@ -2043,9 +2040,9 @@ DWORD wodOpen(WORD wDevID, LPWAVEOPENDESC lpDesc, DWORD dwFlags)
(lpDesc->lpFormat->wBitsPerSample == 16)
? AFMT_S16_LE : AFMT_U8);
if ((ret==MMSYSERR_NOERROR) && (dwFlags & WAVE_DIRECTSOUND)) {
lpDesc->lpFormat->nSamplesPerSec=wwo->ossdev->sample_rate;
lpDesc->lpFormat->nChannels=wwo->ossdev->channels;
lpDesc->lpFormat->wBitsPerSample=(wwo->ossdev->format == AFMT_U8 ? 8 : 16);
lpDesc->lpFormat->nSamplesPerSec=wwo->ossdev.sample_rate;
lpDesc->lpFormat->nChannels=wwo->ossdev.channels;
lpDesc->lpFormat->wBitsPerSample=(wwo->ossdev.format == AFMT_U8 ? 8 : 16);
lpDesc->lpFormat->nBlockAlign=lpDesc->lpFormat->nChannels*lpDesc->lpFormat->wBitsPerSample/8;
lpDesc->lpFormat->nAvgBytesPerSec=lpDesc->lpFormat->nSamplesPerSec*lpDesc->lpFormat->nBlockAlign;
TRACE("OSS_OpenDevice returned this format: %dx%dx%d\n",
@ -2069,16 +2066,16 @@ DWORD wodOpen(WORD wDevID, LPWAVEOPENDESC lpDesc, DWORD dwFlags)
wwo->waveFormat.Format.nChannels;
}
/* Read output space info for future reference */
if (ioctl(wwo->ossdev->fd, SNDCTL_DSP_GETOSPACE, &info) < 0) {
ERR("ioctl(%s, SNDCTL_DSP_GETOSPACE) failed (%s)\n", wwo->ossdev->dev_name, strerror(errno));
OSS_CloseDevice(wwo->ossdev);
if (ioctl(wwo->ossdev.fd, SNDCTL_DSP_GETOSPACE, &info) < 0) {
ERR("ioctl(%s, SNDCTL_DSP_GETOSPACE) failed (%s)\n", wwo->ossdev.dev_name, strerror(errno));
OSS_CloseDevice(&wwo->ossdev);
wwo->state = WINE_WS_CLOSED;
return MMSYSERR_NOTENABLED;
}
TRACE("got %d %d byte fragments (%d ms/fragment)\n", info.fragstotal,
info.fragsize, (info.fragsize * 1000) / (wwo->ossdev->sample_rate *
wwo->ossdev->channels * (wwo->ossdev->format == AFMT_U8 ? 1 : 2)));
info.fragsize, (info.fragsize * 1000) / (wwo->ossdev.sample_rate *
wwo->ossdev.channels * (wwo->ossdev.format == AFMT_U8 ? 1 : 2)));
/* Check that fragsize is correct per our settings above */
if ((info.fragsize > 1024) && (LOWORD(audio_fragment) <= 10)) {
@ -2094,7 +2091,7 @@ DWORD wodOpen(WORD wDevID, LPWAVEOPENDESC lpDesc, DWORD dwFlags)
wwo->bNeedPost = TRUE;
TRACE("fd=%d fragstotal=%d fragsize=%d BufferSize=%d\n",
wwo->ossdev->fd, info.fragstotal, info.fragsize, wwo->dwBufferSize);
wwo->ossdev.fd, info.fragstotal, info.fragsize, wwo->dwBufferSize);
if (wwo->dwFragmentSize % wwo->waveFormat.Format.nBlockAlign) {
ERR("Fragment doesn't contain an integral number of data blocks fragsize=%d BlockAlign=%d\n",wwo->dwFragmentSize,wwo->waveFormat.Format.nBlockAlign);
/* Some SoundBlaster 16 cards return an incorrect (odd) fragment
@ -2149,7 +2146,7 @@ static DWORD wodClose(WORD wDevID)
OSS_DestroyRingMessage(&wwo->msgRing);
OSS_CloseDevice(wwo->ossdev);
OSS_CloseDevice(&wwo->ossdev);
wwo->state = WINE_WS_CLOSED;
wwo->dwFragmentSize = 0;
ret = wodNotifyClient(wwo, WOM_CLOSE, 0L, 0L);
@ -2269,11 +2266,11 @@ static DWORD wodGetPosition(WORD wDevID, LPMMTIME lpTime, DWORD uSize)
wwo = &WOutDev[wDevID];
#ifdef EXACT_WODPOSITION
if (wwo->ossdev->open_access == O_RDWR) {
if (wwo->ossdev->duplex_out_caps.dwSupport & WAVECAPS_SAMPLEACCURATE)
if (wwo->ossdev.open_access == O_RDWR) {
if (wwo->ossdev.duplex_out_caps.dwSupport & WAVECAPS_SAMPLEACCURATE)
OSS_AddRingMessage(&wwo->msgRing, WINE_WM_UPDATE, 0, TRUE);
} else {
if (wwo->ossdev->out_caps.dwSupport & WAVECAPS_SAMPLEACCURATE)
if (wwo->ossdev.out_caps.dwSupport & WAVECAPS_SAMPLEACCURATE)
OSS_AddRingMessage(&wwo->msgRing, WINE_WM_UPDATE, 0, TRUE);
}
#endif
@ -2316,26 +2313,26 @@ static DWORD wodGetVolume(WORD wDevID, LPDWORD lpdwVol)
WARN("invalid parameter\n");
return MMSYSERR_INVALPARAM;
}
if (WOutDev[wDevID].ossdev->open_access == O_RDWR) {
if (!(WOutDev[wDevID].ossdev->duplex_out_caps.dwSupport & WAVECAPS_VOLUME)) {
if (WOutDev[wDevID].ossdev.open_access == O_RDWR) {
if (!(WOutDev[wDevID].ossdev.duplex_out_caps.dwSupport & WAVECAPS_VOLUME)) {
TRACE("Volume not supported\n");
return MMSYSERR_NOTSUPPORTED;
}
} else {
if (!(WOutDev[wDevID].ossdev->out_caps.dwSupport & WAVECAPS_VOLUME)) {
if (!(WOutDev[wDevID].ossdev.out_caps.dwSupport & WAVECAPS_VOLUME)) {
TRACE("Volume not supported\n");
return MMSYSERR_NOTSUPPORTED;
}
}
if ((mixer = open(WOutDev[wDevID].ossdev->mixer_name, O_RDONLY|O_NDELAY)) < 0) {
if ((mixer = open(WOutDev[wDevID].ossdev.mixer_name, O_RDONLY|O_NDELAY)) < 0) {
WARN("mixer device not available !\n");
return MMSYSERR_NOTENABLED;
}
if (ioctl(mixer, SOUND_MIXER_READ_PCM, &volume) == -1) {
close(mixer);
WARN("ioctl(%s, SOUND_MIXER_READ_PCM) failed (%s)\n",
WOutDev[wDevID].ossdev->mixer_name, strerror(errno));
WOutDev[wDevID].ossdev.mixer_name, strerror(errno));
return MMSYSERR_NOTENABLED;
}
close(mixer);
@ -2372,25 +2369,25 @@ DWORD wodSetVolume(WORD wDevID, DWORD dwParam)
WARN("invalid parameter: wDevID > %d\n", numOutDev);
return MMSYSERR_INVALPARAM;
}
if (WOutDev[wDevID].ossdev->open_access == O_RDWR) {
if (!(WOutDev[wDevID].ossdev->duplex_out_caps.dwSupport & WAVECAPS_VOLUME)) {
if (WOutDev[wDevID].ossdev.open_access == O_RDWR) {
if (!(WOutDev[wDevID].ossdev.duplex_out_caps.dwSupport & WAVECAPS_VOLUME)) {
TRACE("Volume not supported\n");
return MMSYSERR_NOTSUPPORTED;
}
} else {
if (!(WOutDev[wDevID].ossdev->out_caps.dwSupport & WAVECAPS_VOLUME)) {
if (!(WOutDev[wDevID].ossdev.out_caps.dwSupport & WAVECAPS_VOLUME)) {
TRACE("Volume not supported\n");
return MMSYSERR_NOTSUPPORTED;
}
}
if ((mixer = open(WOutDev[wDevID].ossdev->mixer_name, O_WRONLY|O_NDELAY)) < 0) {
WARN("open(%s) failed (%s)\n", WOutDev[wDevID].ossdev->mixer_name, strerror(errno));
if ((mixer = open(WOutDev[wDevID].ossdev.mixer_name, O_WRONLY|O_NDELAY)) < 0) {
WARN("open(%s) failed (%s)\n", WOutDev[wDevID].ossdev.mixer_name, strerror(errno));
return MMSYSERR_NOTENABLED;
}
if (ioctl(mixer, SOUND_MIXER_WRITE_PCM, &volume) == -1) {
close(mixer);
WARN("ioctl(%s, SOUND_MIXER_WRITE_PCM) failed (%s)\n",
WOutDev[wDevID].ossdev->mixer_name, strerror(errno));
WOutDev[wDevID].ossdev.mixer_name, strerror(errno));
return MMSYSERR_NOTENABLED;
}
TRACE("volume=%04x\n", (unsigned)volume);
@ -2493,7 +2490,7 @@ static DWORD widGetDevCaps(WORD wDevID, LPWAVEINCAPSW lpCaps, DWORD dwSize)
return MMSYSERR_BADDEVICEID;
}
memcpy(lpCaps, &WInDev[wDevID].ossdev->in_caps, min(dwSize, sizeof(*lpCaps)));
memcpy(lpCaps, &WInDev[wDevID].ossdev.in_caps, min(dwSize, sizeof(*lpCaps)));
return MMSYSERR_NOERROR;
}
@ -2552,15 +2549,15 @@ static DWORD CALLBACK widRecorder(LPVOID pmt)
SetEvent(wwi->hStartUpEvent);
/* disable input so capture will begin when triggered */
wwi->ossdev->bInputEnabled = FALSE;
enable = getEnables(wwi->ossdev);
if (ioctl(wwi->ossdev->fd, SNDCTL_DSP_SETTRIGGER, &enable) < 0)
ERR("ioctl(%s, SNDCTL_DSP_SETTRIGGER) failed (%s)\n", wwi->ossdev->dev_name, strerror(errno));
wwi->ossdev.bInputEnabled = FALSE;
enable = getEnables(&wwi->ossdev);
if (ioctl(wwi->ossdev.fd, SNDCTL_DSP_SETTRIGGER, &enable) < 0)
ERR("ioctl(%s, SNDCTL_DSP_SETTRIGGER) failed (%s)\n", wwi->ossdev.dev_name, strerror(errno));
/* the soundblaster live needs a micro wake to get its recording started
* (or GETISPACE will have 0 frags all the time)
*/
read(wwi->ossdev->fd, &xs, 4);
read(wwi->ossdev.fd, &xs, 4);
/* make sleep time to be # of ms to output a fragment */
dwSleepTime = (wwi->dwFragmentSize * 1000) / wwi->waveFormat.Format.nAvgBytesPerSec;
@ -2576,7 +2573,7 @@ static DWORD CALLBACK widRecorder(LPVOID pmt)
{
lpWaveHdr = wwi->lpQueuePtr;
ioctl(wwi->ossdev->fd, SNDCTL_DSP_GETISPACE, &info);
ioctl(wwi->ossdev.fd, SNDCTL_DSP_GETISPACE, &info);
TRACE("info={frag=%d fsize=%d ftotal=%d bytes=%d}\n", info.fragments, info.fragsize, info.fragstotal, info.bytes);
/* read all the fragments accumulated so far */
@ -2587,7 +2584,7 @@ static DWORD CALLBACK widRecorder(LPVOID pmt)
if (lpWaveHdr->dwBufferLength - lpWaveHdr->dwBytesRecorded >= wwi->dwFragmentSize)
{
/* directly read fragment in wavehdr */
bytesRead = read(wwi->ossdev->fd,
bytesRead = read(wwi->ossdev.fd,
lpWaveHdr->lpData + lpWaveHdr->dwBytesRecorded,
wwi->dwFragmentSize);
@ -2615,7 +2612,7 @@ static DWORD CALLBACK widRecorder(LPVOID pmt)
lpWaveHdr = lpNext;
}
} else {
TRACE("read(%s, %p, %d) failed (%s)\n", wwi->ossdev->dev_name,
TRACE("read(%s, %p, %d) failed (%s)\n", wwi->ossdev.dev_name,
lpWaveHdr->lpData + lpWaveHdr->dwBytesRecorded,
wwi->dwFragmentSize, strerror(errno));
}
@ -2623,13 +2620,13 @@ static DWORD CALLBACK widRecorder(LPVOID pmt)
else
{
/* read the fragment in a local buffer */
bytesRead = read(wwi->ossdev->fd, buffer, wwi->dwFragmentSize);
bytesRead = read(wwi->ossdev.fd, buffer, wwi->dwFragmentSize);
pOffset = buffer;
TRACE("bytesRead=%d (local)\n", bytesRead);
if (bytesRead == (DWORD) -1) {
TRACE("read(%s, %p, %d) failed (%s)\n", wwi->ossdev->dev_name,
TRACE("read(%s, %p, %d) failed (%s)\n", wwi->ossdev.dev_name,
buffer, wwi->dwFragmentSize, strerror(errno));
continue;
}
@ -2718,21 +2715,21 @@ static DWORD CALLBACK widRecorder(LPVOID pmt)
case WINE_WM_STARTING:
wwi->state = WINE_WS_PLAYING;
if (wwi->ossdev->bTriggerSupport)
if (wwi->ossdev.bTriggerSupport)
{
/* start the recording */
wwi->ossdev->bInputEnabled = TRUE;
enable = getEnables(wwi->ossdev);
if (ioctl(wwi->ossdev->fd, SNDCTL_DSP_SETTRIGGER, &enable) < 0) {
wwi->ossdev->bInputEnabled = FALSE;
ERR("ioctl(%s, SNDCTL_DSP_SETTRIGGER) failed (%s)\n", wwi->ossdev->dev_name, strerror(errno));
wwi->ossdev.bInputEnabled = TRUE;
enable = getEnables(&wwi->ossdev);
if (ioctl(wwi->ossdev.fd, SNDCTL_DSP_SETTRIGGER, &enable) < 0) {
wwi->ossdev.bInputEnabled = FALSE;
ERR("ioctl(%s, SNDCTL_DSP_SETTRIGGER) failed (%s)\n", wwi->ossdev.dev_name, strerror(errno));
}
}
else
{
unsigned char data[4];
/* read 4 bytes to start the recording */
read(wwi->ossdev->fd, data, 4);
read(wwi->ossdev.fd, data, 4);
}
SetEvent(ev);
@ -2751,14 +2748,14 @@ static DWORD CALLBACK widRecorder(LPVOID pmt)
case WINE_WM_STOPPING:
if (wwi->state != WINE_WS_STOPPED)
{
if (wwi->ossdev->bTriggerSupport)
if (wwi->ossdev.bTriggerSupport)
{
/* stop the recording */
wwi->ossdev->bInputEnabled = FALSE;
enable = getEnables(wwi->ossdev);
if (ioctl(wwi->ossdev->fd, SNDCTL_DSP_SETTRIGGER, &enable) < 0) {
wwi->ossdev->bInputEnabled = FALSE;
ERR("ioctl(%s, SNDCTL_DSP_SETTRIGGER) failed (%s)\n", wwi->ossdev->dev_name, strerror(errno));
wwi->ossdev.bInputEnabled = FALSE;
enable = getEnables(&wwi->ossdev);
if (ioctl(wwi->ossdev.fd, SNDCTL_DSP_SETTRIGGER, &enable) < 0) {
wwi->ossdev.bInputEnabled = FALSE;
ERR("ioctl(%s, SNDCTL_DSP_SETTRIGGER) failed (%s)\n", wwi->ossdev.dev_name, strerror(errno));
}
}
@ -2783,14 +2780,14 @@ static DWORD CALLBACK widRecorder(LPVOID pmt)
case WINE_WM_RESETTING:
if (wwi->state != WINE_WS_STOPPED)
{
if (wwi->ossdev->bTriggerSupport)
if (wwi->ossdev.bTriggerSupport)
{
/* stop the recording */
wwi->ossdev->bInputEnabled = FALSE;
enable = getEnables(wwi->ossdev);
if (ioctl(wwi->ossdev->fd, SNDCTL_DSP_SETTRIGGER, &enable) < 0) {
wwi->ossdev->bInputEnabled = FALSE;
ERR("ioctl(%s, SNDCTL_DSP_SETTRIGGER) failed (%s)\n", wwi->ossdev->dev_name, strerror(errno));
wwi->ossdev.bInputEnabled = FALSE;
enable = getEnables(&wwi->ossdev);
if (ioctl(wwi->ossdev.fd, SNDCTL_DSP_SETTRIGGER, &enable) < 0) {
wwi->ossdev.bInputEnabled = FALSE;
ERR("ioctl(%s, SNDCTL_DSP_SETTRIGGER) failed (%s)\n", wwi->ossdev.dev_name, strerror(errno));
}
}
}
@ -2816,8 +2813,8 @@ static DWORD CALLBACK widRecorder(LPVOID pmt)
case WINE_WM_UPDATE:
if (wwi->state == WINE_WS_PLAYING) {
audio_buf_info tmp_info;
if (ioctl(wwi->ossdev->fd, SNDCTL_DSP_GETISPACE, &tmp_info) < 0)
ERR("ioctl(%s, SNDCTL_DSP_GETISPACE) failed (%s)\n", wwi->ossdev->dev_name, strerror(errno));
if (ioctl(wwi->ossdev.fd, SNDCTL_DSP_GETISPACE, &tmp_info) < 0)
ERR("ioctl(%s, SNDCTL_DSP_GETISPACE) failed (%s)\n", wwi->ossdev.dev_name, strerror(errno));
else
wwi->dwTotalRecorded = wwi->dwTotalRead + tmp_info.bytes;
}
@ -2890,13 +2887,13 @@ DWORD widOpen(WORD wDevID, LPWAVEOPENDESC lpDesc, DWORD dwFlags)
if (wwi->state != WINE_WS_CLOSED) return MMSYSERR_ALLOCATED;
if ((dwFlags & WAVE_DIRECTSOUND) &&
!(wwi->ossdev->in_caps_support & WAVECAPS_DIRECTSOUND))
!(wwi->ossdev.in_caps_support & WAVECAPS_DIRECTSOUND))
/* not supported, ignore it */
dwFlags &= ~WAVE_DIRECTSOUND;
if (dwFlags & WAVE_DIRECTSOUND) {
TRACE("has DirectSoundCapture driver\n");
if (wwi->ossdev->in_caps_support & WAVECAPS_SAMPLEACCURATE)
if (wwi->ossdev.in_caps_support & WAVECAPS_SAMPLEACCURATE)
/* we have realtime DirectSound, fragments just waste our time,
* but a large buffer is good, so choose 64KB (32 * 2^11) */
audio_fragment = 0x0020000B;
@ -2906,11 +2903,11 @@ DWORD widOpen(WORD wDevID, LPWAVEOPENDESC lpDesc, DWORD dwFlags)
audio_fragment = 0x01000008;
} else {
TRACE("doesn't have DirectSoundCapture driver\n");
if (wwi->ossdev->open_count > 0) {
if (wwi->ossdev.open_count > 0) {
TRACE("Using output device audio_fragment\n");
/* FIXME: This may not be optimal for capture but it allows us
* to do hardware playback without hardware capture. */
audio_fragment = wwi->ossdev->audio_fragment;
audio_fragment = wwi->ossdev.audio_fragment;
} else {
/* A wave device must have a worst case latency of 10 ms so calculate
* the largest fragment size less than 10 ms long.
@ -2928,7 +2925,7 @@ DWORD widOpen(WORD wDevID, LPWAVEOPENDESC lpDesc, DWORD dwFlags)
1 << (audio_fragment & 0xffff),
((1 << (audio_fragment & 0xffff)) * 1000) / lpDesc->lpFormat->nAvgBytesPerSec);
ret = OSS_OpenDevice(wwi->ossdev, O_RDONLY, &audio_fragment,
ret = OSS_OpenDevice(&wwi->ossdev, O_RDONLY, &audio_fragment,
1,
lpDesc->lpFormat->nSamplesPerSec,
lpDesc->lpFormat->nChannels,
@ -2956,17 +2953,17 @@ DWORD widOpen(WORD wDevID, LPWAVEOPENDESC lpDesc, DWORD dwFlags)
wwi->waveFormat.Format.nChannels;
}
if (ioctl(wwi->ossdev->fd, SNDCTL_DSP_GETISPACE, &info) < 0) {
if (ioctl(wwi->ossdev.fd, SNDCTL_DSP_GETISPACE, &info) < 0) {
ERR("ioctl(%s, SNDCTL_DSP_GETISPACE) failed (%s)\n",
wwi->ossdev->dev_name, strerror(errno));
OSS_CloseDevice(wwi->ossdev);
wwi->ossdev.dev_name, strerror(errno));
OSS_CloseDevice(&wwi->ossdev);
wwi->state = WINE_WS_CLOSED;
return MMSYSERR_NOTENABLED;
}
TRACE("got %d %d byte fragments (%d ms/fragment)\n", info.fragstotal,
info.fragsize, (info.fragsize * 1000) / (wwi->ossdev->sample_rate *
wwi->ossdev->channels * (wwi->ossdev->format == AFMT_U8 ? 1 : 2)));
info.fragsize, (info.fragsize * 1000) / (wwi->ossdev.sample_rate *
wwi->ossdev.channels * (wwi->ossdev.format == AFMT_U8 ? 1 : 2)));
wwi->dwFragmentSize = info.fragsize;
@ -3010,7 +3007,7 @@ static DWORD widClose(WORD wDevID)
}
OSS_AddRingMessage(&wwi->msgRing, WINE_WM_CLOSING, 0, TRUE);
OSS_CloseDevice(wwi->ossdev);
OSS_CloseDevice(&wwi->ossdev);
wwi->state = WINE_WS_CLOSED;
wwi->dwFragmentSize = 0;
OSS_DestroyRingMessage(&wwi->msgRing);
@ -3112,7 +3109,7 @@ static DWORD widGetPosition(WORD wDevID, LPMMTIME lpTime, DWORD uSize)
wwi = &WInDev[wDevID];
#ifdef EXACT_WIDPOSITION
if (wwi->ossdev->in_caps_support & WAVECAPS_SAMPLEACCURATE)
if (wwi->ossdev.in_caps_support & WAVECAPS_SAMPLEACCURATE)
OSS_AddRingMessage(&(wwi->msgRing), WINE_WM_UPDATE, 0, TRUE);
#endif

View File

@ -110,7 +110,7 @@ typedef struct tagOSS_DEVICE {
} OSS_DEVICE;
typedef struct {
OSS_DEVICE* ossdev;
OSS_DEVICE ossdev;
volatile int state; /* one of the WINE_WS_ manifest constants */
WAVEOPENDESC waveDesc;
WORD wFlags;
@ -143,7 +143,7 @@ typedef struct {
} WINE_WAVEOUT;
typedef struct {
OSS_DEVICE* ossdev;
OSS_DEVICE ossdev;
volatile int state;
DWORD dwFragmentSize; /* OpenSound '/dev/dsp' give us that size */
WAVEOPENDESC waveDesc;
@ -160,7 +160,6 @@ typedef struct {
OSS_MSG_RING msgRing;
} WINE_WAVEIN;
extern OSS_DEVICE OSS_Devices[MAX_WAVEDRV];
extern WINE_WAVEOUT WOutDev[MAX_WAVEDRV];
extern WINE_WAVEIN WInDev[MAX_WAVEDRV];
extern unsigned numOutDev;

View File

@ -356,7 +356,7 @@ static HRESULT DSCDB_MapBuffer(IDsCaptureDriverBufferImpl *dscdb)
{
if (!dscdb->mapping) {
dscdb->mapping = mmap(NULL, dscdb->maplen, PROT_READ, MAP_SHARED,
WInDev[dscdb->drv->wDevID].ossdev->fd, 0);
WInDev[dscdb->drv->wDevID].ossdev.fd, 0);
if (dscdb->mapping == (LPBYTE)-1) {
TRACE("(%p): Could not map sound device for direct access (%s)\n",
dscdb, strerror(errno));
@ -462,7 +462,7 @@ static ULONG WINAPI IDsCaptureDriverBufferImpl_Release(PIDSCDRIVERBUFFER iface)
DSCDB_UnmapBuffer(This);
OSS_CloseDevice(wwi->ossdev);
OSS_CloseDevice(&wwi->ossdev);
wwi->state = WINE_WS_CLOSED;
wwi->dwFragmentSize = 0;
This->drv->capture_buffer = NULL;
@ -619,28 +619,28 @@ static HRESULT WINAPI IDsCaptureDriverBufferImpl_Start(
if (dwFlags & DSCBSTART_LOOPING)
This->is_looping = TRUE;
WInDev[This->drv->wDevID].ossdev->bInputEnabled = TRUE;
enable = getEnables(WInDev[This->drv->wDevID].ossdev);
if (ioctl(WInDev[This->drv->wDevID].ossdev->fd, SNDCTL_DSP_SETTRIGGER, &enable) < 0) {
WInDev[This->drv->wDevID].ossdev.bInputEnabled = TRUE;
enable = getEnables(&WInDev[This->drv->wDevID].ossdev);
if (ioctl(WInDev[This->drv->wDevID].ossdev.fd, SNDCTL_DSP_SETTRIGGER, &enable) < 0) {
if (errno == EINVAL) {
/* Don't give up yet. OSS trigger support is inconsistent. */
if (WInDev[This->drv->wDevID].ossdev->open_count == 1) {
if (WInDev[This->drv->wDevID].ossdev.open_count == 1) {
/* try the opposite output enable */
if (WInDev[This->drv->wDevID].ossdev->bOutputEnabled == FALSE)
WInDev[This->drv->wDevID].ossdev->bOutputEnabled = TRUE;
if (WInDev[This->drv->wDevID].ossdev.bOutputEnabled == FALSE)
WInDev[This->drv->wDevID].ossdev.bOutputEnabled = TRUE;
else
WInDev[This->drv->wDevID].ossdev->bOutputEnabled = FALSE;
WInDev[This->drv->wDevID].ossdev.bOutputEnabled = FALSE;
/* try it again */
enable = getEnables(WInDev[This->drv->wDevID].ossdev);
if (ioctl(WInDev[This->drv->wDevID].ossdev->fd, SNDCTL_DSP_SETTRIGGER, &enable) >= 0) {
enable = getEnables(&WInDev[This->drv->wDevID].ossdev);
if (ioctl(WInDev[This->drv->wDevID].ossdev.fd, SNDCTL_DSP_SETTRIGGER, &enable) >= 0) {
This->is_capturing = TRUE;
return DS_OK;
}
}
}
ERR("ioctl(%s, SNDCTL_DSP_SETTRIGGER) failed (%s)\n",
WInDev[This->drv->wDevID].ossdev->dev_name, strerror(errno));
WInDev[This->drv->wDevID].ossdev->bInputEnabled = FALSE;
WInDev[This->drv->wDevID].ossdev.dev_name, strerror(errno));
WInDev[This->drv->wDevID].ossdev.bInputEnabled = FALSE;
return DSERR_GENERIC;
}
@ -658,11 +658,11 @@ static HRESULT WINAPI IDsCaptureDriverBufferImpl_Stop(PIDSCDRIVERBUFFER iface)
return DS_OK;
/* no more capturing */
WInDev[This->drv->wDevID].ossdev->bInputEnabled = FALSE;
enable = getEnables(WInDev[This->drv->wDevID].ossdev);
if (ioctl(WInDev[This->drv->wDevID].ossdev->fd, SNDCTL_DSP_SETTRIGGER, &enable) < 0) {
WInDev[This->drv->wDevID].ossdev.bInputEnabled = FALSE;
enable = getEnables(&WInDev[This->drv->wDevID].ossdev);
if (ioctl(WInDev[This->drv->wDevID].ossdev.fd, SNDCTL_DSP_SETTRIGGER, &enable) < 0) {
ERR("ioctl(%s, SNDCTL_DSP_SETTRIGGER) failed (%s)\n",
WInDev[This->drv->wDevID].ossdev->dev_name, strerror(errno));
WInDev[This->drv->wDevID].ossdev.dev_name, strerror(errno));
return DSERR_GENERIC;
}
@ -769,7 +769,7 @@ static HRESULT WINAPI IDsCaptureDriverImpl_GetDriverDesc(
}
/* copy version from driver */
memcpy(pDesc, &(WInDev[This->wDevID].ossdev->ds_desc), sizeof(DSDRIVERDESC));
memcpy(pDesc, &(WInDev[This->wDevID].ossdev.ds_desc), sizeof(DSDRIVERDESC));
pDesc->dnDevNode = WInDev[This->wDevID].waveDesc.dnDevNode;
pDesc->wVxdId = 0;
@ -809,7 +809,7 @@ static HRESULT WINAPI IDsCaptureDriverImpl_GetCaps(
{
IDsCaptureDriverImpl *This = (IDsCaptureDriverImpl *)iface;
TRACE("(%p,%p)\n",This,pCaps);
memcpy(pCaps, &(WInDev[This->wDevID].ossdev->dsc_caps), sizeof(DSCDRIVERCAPS));
memcpy(pCaps, &(WInDev[This->wDevID].ossdev.dsc_caps), sizeof(DSCDRIVERCAPS));
return DS_OK;
}
@ -902,7 +902,7 @@ static DWORD CALLBACK DSCDB_Thread(LPVOID lpParameter)
/* get the current DMA position */
if (ioctl(This->fd, SNDCTL_DSP_GETIPTR, &info) < 0) {
ERR("ioctl(%s, SNDCTL_DSP_GETIPTR) failed (%s)\n",
WInDev[This->drv->wDevID].ossdev->dev_name, strerror(errno));
WInDev[This->drv->wDevID].ossdev.dev_name, strerror(errno));
return DSERR_GENERIC;
}
@ -1044,9 +1044,9 @@ static HRESULT WINAPI IDsCaptureDriverImpl_CreateCaptureBuffer(
if (wwi->state == WINE_WS_CLOSED) {
unsigned int frag_size;
if (wwi->ossdev->open_count > 0) {
if (wwi->ossdev.open_count > 0) {
/* opened already so use existing fragment size */
audio_fragment = wwi->ossdev->audio_fragment;
audio_fragment = wwi->ossdev.audio_fragment;
} else {
/* calculate a fragment size */
unsigned int mask = 0xffffffff;
@ -1107,7 +1107,7 @@ static HRESULT WINAPI IDsCaptureDriverImpl_CreateCaptureBuffer(
audio_fragment >> 16, frag_size, frag_size * (audio_fragment >> 16),
(frag_size * 1000) / pwfx->nAvgBytesPerSec);
ret = OSS_OpenDevice(wwi->ossdev, O_RDWR, &audio_fragment, 1,
ret = OSS_OpenDevice(&wwi->ossdev, O_RDWR, &audio_fragment, 1,
pwfx->nSamplesPerSec,
(pwfx->nChannels > 1) ? 1 : 0,
(pwfx->wBitsPerSample == 16)
@ -1123,10 +1123,10 @@ static HRESULT WINAPI IDsCaptureDriverImpl_CreateCaptureBuffer(
wwi->state = WINE_WS_STOPPED;
/* find out what fragment and buffer sizes OSS gave us */
if (ioctl(wwi->ossdev->fd, SNDCTL_DSP_GETISPACE, &info) < 0) {
if (ioctl(wwi->ossdev.fd, SNDCTL_DSP_GETISPACE, &info) < 0) {
ERR("ioctl(%s, SNDCTL_DSP_GETISPACE) failed (%s)\n",
wwi->ossdev->dev_name, strerror(errno));
OSS_CloseDevice(wwi->ossdev);
wwi->ossdev.dev_name, strerror(errno));
OSS_CloseDevice(&wwi->ossdev);
wwi->state = WINE_WS_CLOSED;
HeapFree(GetProcessHeap(),0,*ippdscdb);
*ippdscdb = NULL;
@ -1152,11 +1152,11 @@ static HRESULT WINAPI IDsCaptureDriverImpl_CreateCaptureBuffer(
TRACE("same buffer length but different fragment size\n");
}
}
(*ippdscdb)->fd = WInDev[This->wDevID].ossdev->fd;
(*ippdscdb)->fd = WInDev[This->wDevID].ossdev.fd;
if (pipe((*ippdscdb)->pipe_fd) < 0) {
TRACE("pipe() failed (%s)\n", strerror(errno));
OSS_CloseDevice(wwi->ossdev);
OSS_CloseDevice(&wwi->ossdev);
wwi->state = WINE_WS_CLOSED;
HeapFree(GetProcessHeap(),0,*ippdscdb);
*ippdscdb = NULL;
@ -1164,10 +1164,10 @@ static HRESULT WINAPI IDsCaptureDriverImpl_CreateCaptureBuffer(
}
/* check how big the DMA buffer is now */
if (ioctl(wwi->ossdev->fd, SNDCTL_DSP_GETISPACE, &info) < 0) {
if (ioctl(wwi->ossdev.fd, SNDCTL_DSP_GETISPACE, &info) < 0) {
ERR("ioctl(%s, SNDCTL_DSP_GETISPACE) failed (%s)\n",
wwi->ossdev->dev_name, strerror(errno));
OSS_CloseDevice(wwi->ossdev);
wwi->ossdev.dev_name, strerror(errno));
OSS_CloseDevice(&wwi->ossdev);
wwi->state = WINE_WS_CLOSED;
close((*ippdscdb)->pipe_fd[0]);
close((*ippdscdb)->pipe_fd[1]);
@ -1184,7 +1184,7 @@ static HRESULT WINAPI IDsCaptureDriverImpl_CreateCaptureBuffer(
/* map the DMA buffer */
err = DSCDB_MapBuffer(*ippdscdb);
if (err != DS_OK) {
OSS_CloseDevice(wwi->ossdev);
OSS_CloseDevice(&wwi->ossdev);
wwi->state = WINE_WS_CLOSED;
close((*ippdscdb)->pipe_fd[0]);
close((*ippdscdb)->pipe_fd[1]);
@ -1198,7 +1198,7 @@ static HRESULT WINAPI IDsCaptureDriverImpl_CreateCaptureBuffer(
(*ippdscdb)->buffer = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY,(*ippdscdb)->buflen);
if ((*ippdscdb)->buffer == NULL) {
OSS_CloseDevice(wwi->ossdev);
OSS_CloseDevice(&wwi->ossdev);
wwi->state = WINE_WS_CLOSED;
close((*ippdscdb)->pipe_fd[0]);
close((*ippdscdb)->pipe_fd[1]);
@ -1284,7 +1284,7 @@ DWORD widDsCreate(UINT wDevID, PIDSCDRIVER* drv)
TRACE("(%d,%p)\n",wDevID,drv);
/* the HAL isn't much better than the HEL if we can't do mmap() */
if (!(WInDev[wDevID].ossdev->in_caps_support & WAVECAPS_DIRECTSOUND)) {
if (!(WInDev[wDevID].ossdev.in_caps_support & WAVECAPS_DIRECTSOUND)) {
ERR("DirectSoundCapture flag not set\n");
MESSAGE("This sound card's driver does not support direct access\n");
MESSAGE("The (slower) DirectSound HEL mode will be used instead.\n");
@ -1304,7 +1304,7 @@ DWORD widDsCreate(UINT wDevID, PIDSCDRIVER* drv)
DWORD widDsDesc(UINT wDevID, PDSDRIVERDESC desc)
{
memcpy(desc, &(WInDev[wDevID].ossdev->ds_desc), sizeof(DSDRIVERDESC));
memcpy(desc, &(WInDev[wDevID].ossdev.ds_desc), sizeof(DSDRIVERDESC));
return MMSYSERR_NOERROR;
}

View File

@ -475,8 +475,8 @@ static ULONG WINAPI IDsDriverBufferImpl_Release(PIDSDRIVERBUFFER iface)
TRACE("(%p) buffer count is now %d\n", This, This->drv->nrofsecondaries);
}
WOutDev[This->drv->wDevID].ossdev->ds_caps.dwFreeHwMixingAllBuffers++;
WOutDev[This->drv->wDevID].ossdev->ds_caps.dwFreeHwMixingStreamingBuffers++;
WOutDev[This->drv->wDevID].ossdev.ds_caps.dwFreeHwMixingAllBuffers++;
WOutDev[This->drv->wDevID].ossdev.ds_caps.dwFreeHwMixingStreamingBuffers++;
}
DSDB_UnmapBuffer(This);
@ -566,14 +566,14 @@ static HRESULT WINAPI IDsDriverBufferImpl_GetPosition(PIDSDRIVERBUFFER iface,
}
if (ioctl(This->fd, SNDCTL_DSP_GETOPTR, &info) < 0) {
ERR("ioctl(%s, SNDCTL_DSP_GETOPTR) failed (%s)\n",
WOutDev[This->drv->wDevID].ossdev->dev_name, strerror(errno));
WOutDev[This->drv->wDevID].ossdev.dev_name, strerror(errno));
return DSERR_GENERIC;
}
ptr = info.ptr & ~3; /* align the pointer, just in case */
if (lpdwPlay) *lpdwPlay = ptr;
if (lpdwWrite) {
/* add some safety margin (not strictly necessary, but...) */
if (WOutDev[This->drv->wDevID].ossdev->duplex_out_caps.dwSupport & WAVECAPS_SAMPLEACCURATE)
if (WOutDev[This->drv->wDevID].ossdev.duplex_out_caps.dwSupport & WAVECAPS_SAMPLEACCURATE)
*lpdwWrite = ptr + 32;
else
*lpdwWrite = ptr + WOutDev[This->drv->wDevID].dwFragmentSize;
@ -589,26 +589,26 @@ static HRESULT WINAPI IDsDriverBufferImpl_Play(PIDSDRIVERBUFFER iface, DWORD dwR
IDsDriverBufferImpl *This = (IDsDriverBufferImpl *)iface;
int enable;
TRACE("(%p,%x,%x,%x)\n",iface,dwRes1,dwRes2,dwFlags);
WOutDev[This->drv->wDevID].ossdev->bOutputEnabled = TRUE;
enable = getEnables(WOutDev[This->drv->wDevID].ossdev);
WOutDev[This->drv->wDevID].ossdev.bOutputEnabled = TRUE;
enable = getEnables(&WOutDev[This->drv->wDevID].ossdev);
if (ioctl(This->fd, SNDCTL_DSP_SETTRIGGER, &enable) < 0) {
if (errno == EINVAL) {
/* Don't give up yet. OSS trigger support is inconsistent. */
if (WOutDev[This->drv->wDevID].ossdev->open_count == 1) {
if (WOutDev[This->drv->wDevID].ossdev.open_count == 1) {
/* try the opposite input enable */
if (WOutDev[This->drv->wDevID].ossdev->bInputEnabled == FALSE)
WOutDev[This->drv->wDevID].ossdev->bInputEnabled = TRUE;
if (WOutDev[This->drv->wDevID].ossdev.bInputEnabled == FALSE)
WOutDev[This->drv->wDevID].ossdev.bInputEnabled = TRUE;
else
WOutDev[This->drv->wDevID].ossdev->bInputEnabled = FALSE;
WOutDev[This->drv->wDevID].ossdev.bInputEnabled = FALSE;
/* try it again */
enable = getEnables(WOutDev[This->drv->wDevID].ossdev);
enable = getEnables(&WOutDev[This->drv->wDevID].ossdev);
if (ioctl(This->fd, SNDCTL_DSP_SETTRIGGER, &enable) >= 0)
return DS_OK;
}
}
ERR("ioctl(%s, SNDCTL_DSP_SETTRIGGER) failed (%s)\n",
WOutDev[This->drv->wDevID].ossdev->dev_name, strerror(errno));
WOutDev[This->drv->wDevID].ossdev->bOutputEnabled = FALSE;
WOutDev[This->drv->wDevID].ossdev.dev_name, strerror(errno));
WOutDev[This->drv->wDevID].ossdev.bOutputEnabled = FALSE;
return DSERR_GENERIC;
}
return DS_OK;
@ -620,16 +620,16 @@ static HRESULT WINAPI IDsDriverBufferImpl_Stop(PIDSDRIVERBUFFER iface)
int enable;
TRACE("(%p)\n",iface);
/* no more playing */
WOutDev[This->drv->wDevID].ossdev->bOutputEnabled = FALSE;
enable = getEnables(WOutDev[This->drv->wDevID].ossdev);
WOutDev[This->drv->wDevID].ossdev.bOutputEnabled = FALSE;
enable = getEnables(&WOutDev[This->drv->wDevID].ossdev);
if (ioctl(This->fd, SNDCTL_DSP_SETTRIGGER, &enable) < 0) {
ERR("ioctl(%s, SNDCTL_DSP_SETTRIGGER) failed (%s)\n", WOutDev[This->drv->wDevID].ossdev->dev_name, strerror(errno));
ERR("ioctl(%s, SNDCTL_DSP_SETTRIGGER) failed (%s)\n", WOutDev[This->drv->wDevID].ossdev.dev_name, strerror(errno));
return DSERR_GENERIC;
}
#if 0
/* the play position must be reset to the beginning of the buffer */
if (ioctl(This->fd, SNDCTL_DSP_RESET, 0) < 0) {
ERR("ioctl(%s, SNDCTL_DSP_RESET) failed (%s)\n", WOutDev[This->drv->wDevID].ossdev->dev_name, strerror(errno));
ERR("ioctl(%s, SNDCTL_DSP_RESET) failed (%s)\n", WOutDev[This->drv->wDevID].ossdev.dev_name, strerror(errno));
return DSERR_GENERIC;
}
#endif
@ -638,7 +638,7 @@ static HRESULT WINAPI IDsDriverBufferImpl_Stop(PIDSDRIVERBUFFER iface)
* that it should completely recreate this HW buffer...
* this unexpected error code should do the trick... */
/* FIXME: ...unless we are doing full duplex, then it's not nice to close the device */
if (WOutDev[This->drv->wDevID].ossdev->open_count == 1)
if (WOutDev[This->drv->wDevID].ossdev.open_count == 1)
return DSERR_BUFFERLOST;
return DS_OK;
@ -710,7 +710,7 @@ static HRESULT WINAPI IDsDriverImpl_GetDriverDesc(PIDSDRIVER iface,
TRACE("(%p,%p)\n",iface,pDesc);
/* copy version from driver */
memcpy(pDesc, &(WOutDev[This->wDevID].ossdev->ds_desc), sizeof(DSDRIVERDESC));
memcpy(pDesc, &(WOutDev[This->wDevID].ossdev.ds_desc), sizeof(DSDRIVERDESC));
pDesc->dwFlags |= DSDDESC_DOMMSYSTEMOPEN | DSDDESC_DOMMSYSTEMSETFORMAT |
DSDDESC_USESYSTEMMEMORY | DSDDESC_DONTNEEDPRIMARYLOCK |
@ -736,11 +736,11 @@ static HRESULT WINAPI IDsDriverImpl_Open(PIDSDRIVER iface)
TRACE("(%p)\n",iface);
/* make sure the card doesn't start playing before we want it to */
WOutDev[This->wDevID].ossdev->bOutputEnabled = FALSE;
WOutDev[This->wDevID].ossdev->bInputEnabled = FALSE;
enable = getEnables(WOutDev[This->wDevID].ossdev);
if (ioctl(WOutDev[This->wDevID].ossdev->fd, SNDCTL_DSP_SETTRIGGER, &enable) < 0) {
ERR("ioctl(%s, SNDCTL_DSP_SETTRIGGER) failed (%s)\n",WOutDev[This->wDevID].ossdev->dev_name, strerror(errno));
WOutDev[This->wDevID].ossdev.bOutputEnabled = FALSE;
WOutDev[This->wDevID].ossdev.bInputEnabled = FALSE;
enable = getEnables(&WOutDev[This->wDevID].ossdev);
if (ioctl(WOutDev[This->wDevID].ossdev.fd, SNDCTL_DSP_SETTRIGGER, &enable) < 0) {
ERR("ioctl(%s, SNDCTL_DSP_SETTRIGGER) failed (%s)\n",WOutDev[This->wDevID].ossdev.dev_name, strerror(errno));
return DSERR_GENERIC;
}
return DS_OK;
@ -761,7 +761,7 @@ static HRESULT WINAPI IDsDriverImpl_GetCaps(PIDSDRIVER iface, PDSDRIVERCAPS pCap
{
IDsDriverImpl *This = (IDsDriverImpl *)iface;
TRACE("(%p,%p)\n",iface,pCaps);
memcpy(pCaps, &(WOutDev[This->wDevID].ossdev->ds_caps), sizeof(DSDRIVERCAPS));
memcpy(pCaps, &(WOutDev[This->wDevID].ossdev.ds_caps), sizeof(DSDRIVERCAPS));
return DS_OK;
}
@ -792,13 +792,13 @@ static HRESULT WINAPI DSD_CreatePrimaryBuffer(PIDSDRIVER iface,
(*ippdsdb)->ref = 1;
(*ippdsdb)->drv = This;
copy_format(pwfx, &(*ippdsdb)->wfex);
(*ippdsdb)->fd = WOutDev[This->wDevID].ossdev->fd;
(*ippdsdb)->fd = WOutDev[This->wDevID].ossdev.fd;
(*ippdsdb)->dwFlags = dwFlags;
/* check how big the DMA buffer is now */
if (ioctl((*ippdsdb)->fd, SNDCTL_DSP_GETOSPACE, &info) < 0) {
ERR("ioctl(%s, SNDCTL_DSP_GETOSPACE) failed (%s)\n",
WOutDev[This->wDevID].ossdev->dev_name, strerror(errno));
WOutDev[This->wDevID].ossdev.dev_name, strerror(errno));
HeapFree(GetProcessHeap(),0,*ippdsdb);
*ippdsdb = NULL;
return DSERR_GENERIC;
@ -818,12 +818,12 @@ static HRESULT WINAPI DSD_CreatePrimaryBuffer(PIDSDRIVER iface,
*ppbBuffer = (*ippdsdb)->mapping;
/* some drivers need some extra nudging after mapping */
WOutDev[This->wDevID].ossdev->bInputEnabled = FALSE;
WOutDev[This->wDevID].ossdev->bOutputEnabled = FALSE;
enable = getEnables(WOutDev[This->wDevID].ossdev);
WOutDev[This->wDevID].ossdev.bInputEnabled = FALSE;
WOutDev[This->wDevID].ossdev.bOutputEnabled = FALSE;
enable = getEnables(&WOutDev[This->wDevID].ossdev);
if (ioctl((*ippdsdb)->fd, SNDCTL_DSP_SETTRIGGER, &enable) < 0) {
ERR("ioctl(%s, SNDCTL_DSP_SETTRIGGER) failed (%s)\n",
WOutDev[This->wDevID].ossdev->dev_name, strerror(errno));
WOutDev[This->wDevID].ossdev.dev_name, strerror(errno));
return DSERR_GENERIC;
}
@ -939,7 +939,7 @@ DWORD wodDsCreate(UINT wDevID, PIDSDRIVER* drv)
TRACE("(%d,%p)\n",wDevID,drv);
/* the HAL isn't much better than the HEL if we can't do mmap() */
if (!(WOutDev[wDevID].ossdev->duplex_out_caps.dwSupport & WAVECAPS_DIRECTSOUND)) {
if (!(WOutDev[wDevID].ossdev.duplex_out_caps.dwSupport & WAVECAPS_DIRECTSOUND)) {
WARN("Warn DirectSound flag not set, falling back to HEL layer\n");
return MMSYSERR_NOTSUPPORTED;
}
@ -960,7 +960,7 @@ DWORD wodDsCreate(UINT wDevID, PIDSDRIVER* drv)
DWORD wodDsDesc(UINT wDevID, PDSDRIVERDESC desc)
{
TRACE("(%d,%p)\n",wDevID,desc);
memcpy(desc, &(WOutDev[wDevID].ossdev->ds_desc), sizeof(DSDRIVERDESC));
memcpy(desc, &(WOutDev[wDevID].ossdev.ds_desc), sizeof(DSDRIVERDESC));
return MMSYSERR_NOERROR;
}