http://bugs.winehq.org/show_bug.cgi?id=19523
Raymond superquad.vortex2@gmail.com changed:
What |Removed |Added ---------------------------------------------------------------------------- CC| |superquad.vortex2@gmail.com
--- Comment #6 from Raymond superquad.vortex2@gmail.com 2010-11-07 21:06:44 CST --- (In reply to comment #3)
of course, there is...
let's take the wave out driver interface as example:
DWORD WINAPI wodMessage(UINT wDevID, UINT wMsg, DWORD_PTR dwUser, DWORD_PTR dwParam1, DWORD_PTR dwParam2);
in case wMsg in WODM_OPEN, dwUser is expected to be a pointer to a DWORD, that the driver is supposed to filled with a unique instance ID (to identify the stream)
in other (subsequent) messages, winmm passes in dwUser the unique ID defined by the driver at WODM_OPEN time
winmm correctly supports this scheme (see MMDRV_Open in dlls/winmm/lolvldrv.c)
but, none of the wine drivers correctly initialize the dwUser while processing the various XXXX_OPEN messages
it works as it is because most of the drivers only support a single instance, hence any value for the unique ID will do
HTH
it is possible to modify winealsa.drv to support multiple waveoutopen but the wavemapper masacm32.drv/wavemap.c seem use dwInstance for
WAVEMAPDATA* wom = (WAVEMAPDATA*)dwInstance;
Especially when the "Test Audio" button in winecfg use idw_testsound.wav which is "IMA ADPCM" format
Although wineesd.drv support multiple waveoutopen , but the implemenation seem wrong since it appear as 10 Esound Waveout and Wavein audio drivers in winecfg and 10 sound cards rightmark3dsound
When try to implement multiple voices in winealsa by declaring 16 voices in WINE_WAVEDEV and try to use dwUser to represent the index of voice ,
How can I return the index of voice to wine in wodOpen() and wodPlayer() of winealsa.drv/waveout.c so that wine can pass the index of voice back to subsequent wod* functions ?
BOOL WINAPI DriverCallback(DWORD_PTR dwCallBack, DWORD uFlags, HDRVR hDev, DWORD wMsg, DWORD_PTR dwUser, DWORD_PTR dwParam1, DWORD_PTR dwParam2);
#define MAX_ALSA_VOICE 16
typedef struct {
char* pcmname; /* string name of alsa PCM device */ char* ctlname; /* string name of alsa control device */ char interface_name[MAXPNAMELEN * 2];
/* DirectSound stuff */ DSDRIVERDESC ds_desc; DSDRIVERCAPS ds_caps;
/* Waveout only fields */ WAVEOUTCAPSW outcaps;
/* Wavein only fields */
WAVEINCAPSW incaps; DWORD dwSupport;
struct { volatile int state; /* one of the WINE_WS_ manifest constants */ WAVEFORMATPCMEX format; WORD wFlags; WAVEOPENDESC waveDesc;
snd_pcm_t* pcm; /* handle to ALSA playback device */
snd_pcm_hw_params_t * hw_params;
DWORD dwBufferSize; /* size of whole ALSA buffer in bytes */ LPWAVEHDR lpQueuePtr; /* start of queued WAVEHDRs (waiting to be notified) */ LPWAVEHDR lpPlayPtr; /* start of not yet fully played buffers */
LPWAVEHDR lpLoopPtr; /* pointer of first buffer in loop, if any */ DWORD dwLoops; /* private copy of loop counter */
DWORD dwPlayedTotal; /* number of bytes actually played since opening */ DWORD dwWrittenTotal; /* number of bytes written to ALSA buffer since opening */
/* synchronization stuff */ HANDLE hStartUpEvent; HANDLE hThread; DWORD dwThreadID; ALSA_MSG_RING msgRing; snd_pcm_sframes_t (*read)(snd_pcm_t *, void *, snd_pcm_uframes_t );
snd_pcm_sframes_t (*write)(snd_pcm_t *, const void *, snd_pcm_uframes_t );
DWORD dwPartialOffset; /* Offset of not yet written bytes in lpPlayPtr */
DWORD dwPeriodSize; /* size of OSS buffer period */ DWORD dwTotalRecorded; snd_hctl_t * hctl; /* control handle for the playback volume */ } voice[MAX_ALSA_VOICE];
} WINE_WAVEDEV;