wineoss: Seperate wave-in and wave-outs shared use of a single OSS_DEVICE struct.
This commit is contained in:
parent
847d5565fc
commit
58e26451db
|
@ -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
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue