ReactOS 0.4.17-dev-966-gf06eace
wavemap.c File Reference
#include <stdarg.h>
#include <string.h>
#include "windef.h"
#include "winbase.h"
#include "wingdi.h"
#include "winuser.h"
#include "mmddk.h"
#include "mmreg.h"
#include "msacm.h"
#include "wine/debug.h"
Include dependency graph for wavemap.c:

Go to the source code of this file.

Classes

struct  tagWAVEMAPDATA
 

Macros

#define TRY(sps, bps)
 
#define TRY(sps, bps)
 

Typedefs

typedef struct tagWAVEMAPDATA WAVEMAPDATA
 

Functions

 WINE_DEFAULT_DEBUG_CHANNEL (wavemap)
 
static BOOL WAVEMAP_IsData (const WAVEMAPDATA *wm)
 
static void CALLBACK wodCallback (HWAVEOUT hWave, UINT uMsg, DWORD_PTR dwInstance, DWORD_PTR dwParam1, DWORD_PTR dwParam2)
 
static DWORD wodOpenHelper (WAVEMAPDATA *wom, UINT idx, LPWAVEOPENDESC lpDesc, LPWAVEFORMATEX lpwfx, DWORD dwFlags)
 
static DWORD wodOpen (DWORD_PTR *lpdwUser, LPWAVEOPENDESC lpDesc, DWORD dwFlags)
 
static DWORD wodClose (WAVEMAPDATA *wom)
 
static DWORD wodWrite (WAVEMAPDATA *wom, LPWAVEHDR lpWaveHdrSrc, DWORD dwParam2)
 
static DWORD wodPrepare (WAVEMAPDATA *wom, LPWAVEHDR lpWaveHdrSrc, DWORD dwParam2)
 
static DWORD wodUnprepare (WAVEMAPDATA *wom, LPWAVEHDR lpWaveHdrSrc, DWORD dwParam2)
 
static DWORD wodGetPosition (WAVEMAPDATA *wom, LPMMTIME lpTime, DWORD dwParam2)
 
static DWORD wodGetDevCaps (UINT wDevID, WAVEMAPDATA *wom, LPWAVEOUTCAPSW lpWaveCaps, DWORD dwParam2)
 
static DWORD wodGetVolume (UINT wDevID, WAVEMAPDATA *wom, LPDWORD lpVol)
 
static DWORD wodSetVolume (UINT wDevID, WAVEMAPDATA *wom, DWORD vol)
 
static DWORD wodPause (WAVEMAPDATA *wom)
 
static DWORD wodRestart (WAVEMAPDATA *wom)
 
static DWORD wodReset (WAVEMAPDATA *wom)
 
static DWORD wodBreakLoop (WAVEMAPDATA *wom)
 
static DWORD wodMapperStatus (WAVEMAPDATA *wom, DWORD flags, LPVOID ptr)
 
static DWORD wodMapperReconfigure (WAVEMAPDATA *wom, DWORD dwParam1, DWORD dwParam2)
 
DWORD WINAPI WAVEMAP_wodMessage (UINT wDevID, UINT wMsg, DWORD_PTR dwUser, DWORD_PTR dwParam1, DWORD_PTR dwParam2)
 
static void CALLBACK widCallback (HWAVEIN hWave, UINT uMsg, DWORD_PTR dwInstance, DWORD_PTR dwParam1, DWORD_PTR dwParam2)
 
static DWORD widOpenHelper (WAVEMAPDATA *wim, UINT idx, LPWAVEOPENDESC lpDesc, LPWAVEFORMATEX lpwfx, DWORD dwFlags)
 
static DWORD widOpen (DWORD_PTR *lpdwUser, LPWAVEOPENDESC lpDesc, DWORD dwFlags)
 
static DWORD widClose (WAVEMAPDATA *wim)
 
static DWORD widAddBuffer (WAVEMAPDATA *wim, LPWAVEHDR lpWaveHdrDst, DWORD dwParam2)
 
static DWORD widPrepare (WAVEMAPDATA *wim, LPWAVEHDR lpWaveHdrDst, DWORD dwParam2)
 
static DWORD widUnprepare (WAVEMAPDATA *wim, LPWAVEHDR lpWaveHdrDst, DWORD dwParam2)
 
static DWORD widGetPosition (WAVEMAPDATA *wim, LPMMTIME lpTime, DWORD dwParam2)
 
static DWORD widGetDevCaps (UINT wDevID, WAVEMAPDATA *wim, LPWAVEINCAPSW lpWaveCaps, DWORD dwParam2)
 
static DWORD widStop (WAVEMAPDATA *wim)
 
static DWORD widStart (WAVEMAPDATA *wim)
 
static DWORD widReset (WAVEMAPDATA *wim)
 
static DWORD widMapperStatus (WAVEMAPDATA *wim, DWORD flags, LPVOID ptr)
 
static DWORD widMapperReconfigure (WAVEMAPDATA *wim, DWORD dwParam1, DWORD dwParam2)
 
DWORD WINAPI WAVEMAP_widMessage (WORD wDevID, WORD wMsg, DWORD_PTR dwUser, DWORD_PTR dwParam1, DWORD_PTR dwParam2)
 
static LRESULT WAVEMAP_drvOpen (LPSTR str)
 
static LRESULT WAVEMAP_drvClose (DWORD_PTR dwDevID)
 
LRESULT CALLBACK WAVEMAP_DriverProc (DWORD_PTR dwDevID, HDRVR hDriv, UINT wMsg, LPARAM dwParam1, LPARAM dwParam2)
 

Variables

static struct WINE_WAVEMAP * oss = NULL
 

Macro Definition Documentation

◆ TRY [1/2]

#define TRY (   sps,
  bps 
)
Value:
wfx.nSamplesPerSec = (sps); wfx.wBitsPerSample = (bps); \
switch (res=wodOpenHelper(wom, i, lpDesc, &wfx, dwFlags | WAVE_FORMAT_DIRECT)) { \
case MMSYSERR_NOERROR: wom->avgSpeedInner = wfx.nAvgBytesPerSec; wom->nSamplesPerSecInner = wfx.nSamplesPerSec; goto found; \
case WAVERR_BADFORMAT: break; \
default: goto error; \
}
GLuint res
Definition: glext.h:9613
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
#define error(str)
Definition: mkdosfs.c:1605
#define MMSYSERR_NOERROR
Definition: mmsystem.h:96
#define WAVERR_BADFORMAT
Definition: mmsystem.h:176
#define WAVE_FORMAT_DIRECT
Definition: mmsystem.h:191
_In_ LPWSTR _In_ DWORD _In_ DWORD _In_ DWORD dwFlags
Definition: netsh.h:141
static DWORD wodOpenHelper(WAVEMAPDATA *wom, UINT idx, LPWAVEOPENDESC lpDesc, LPWAVEFORMATEX lpwfx, DWORD dwFlags)
Definition: wavemap.c:122

◆ TRY [2/2]

#define TRY (   sps,
  bps 
)
Value:
wfx.nSamplesPerSec = (sps); wfx.wBitsPerSample = (bps); \
switch (res=widOpenHelper(wim, i, lpDesc, &wfx, dwFlags | WAVE_FORMAT_DIRECT)) { \
case MMSYSERR_NOERROR: wim->avgSpeedInner = wfx.nAvgBytesPerSec; wim->nSamplesPerSecInner = wfx.nSamplesPerSec; goto found; \
case WAVERR_BADFORMAT: break; \
default: goto error; \
}
static DWORD widOpenHelper(WAVEMAPDATA *wim, UINT idx, LPWAVEOPENDESC lpDesc, LPWAVEFORMATEX lpwfx, DWORD dwFlags)
Definition: wavemap.c:710

Typedef Documentation

◆ WAVEMAPDATA

Function Documentation

◆ WAVEMAP_DriverProc()

LRESULT CALLBACK WAVEMAP_DriverProc ( DWORD_PTR  dwDevID,
HDRVR  hDriv,
UINT  wMsg,
LPARAM  dwParam1,
LPARAM  dwParam2 
)

Definition at line 1220 of file wavemap.c.

1222{
1223 TRACE("(%08IX, %p, %08X, %08IX, %08IX)\n",
1224 dwDevID, hDriv, wMsg, dwParam1, dwParam2);
1225
1226 switch(wMsg) {
1227 case DRV_LOAD: return 1;
1228 case DRV_FREE: return 1;
1229 case DRV_OPEN: return WAVEMAP_drvOpen((LPSTR)dwParam1);
1230 case DRV_CLOSE: return WAVEMAP_drvClose(dwDevID);
1231 case DRV_ENABLE: return 1;
1232 case DRV_DISABLE: return 1;
1233 case DRV_QUERYCONFIGURE: return 1;
1234 case DRV_CONFIGURE: MessageBoxA(0, "WAVEMAP MultiMedia Driver !", "Wave mapper Driver", MB_OK); return 1;
1235 case DRV_INSTALL: return DRVCNF_RESTART;
1236 case DRV_REMOVE: return DRVCNF_RESTART;
1237 default:
1238 return DefDriverProc(dwDevID, hDriv, wMsg, dwParam1, dwParam2);
1239 }
1240}
LRESULT WINAPI DefDriverProc(DWORD_PTR dwDriverIdentifier, HDRVR hDrv, UINT Msg, LPARAM lParam1, LPARAM lParam2)
Definition: driver.c:554
#define DRV_LOAD(x)
#define DRV_CLOSE
Definition: mmsystem.h:122
#define DRV_QUERYCONFIGURE
Definition: mmsystem.h:126
#define DRVCNF_RESTART
Definition: mmsystem.h:135
#define DRV_REMOVE
Definition: mmsystem.h:128
#define DRV_ENABLE
Definition: mmsystem.h:120
#define DRV_CONFIGURE
Definition: mmsystem.h:125
#define DRV_OPEN
Definition: mmsystem.h:121
#define DRV_INSTALL
Definition: mmsystem.h:127
#define DRV_FREE
Definition: mmsystem.h:124
#define DRV_DISABLE
Definition: mmsystem.h:123
int WINAPI MessageBoxA(_In_opt_ HWND hWnd, _In_opt_ LPCSTR lpText, _In_opt_ LPCSTR lpCaption, _In_ UINT uType)
#define MB_OK
Definition: winuser.h:801
#define TRACE(s)
Definition: solgame.cpp:4
char * LPSTR
Definition: typedefs.h:51
static LRESULT WAVEMAP_drvClose(DWORD_PTR dwDevID)
Definition: wavemap.c:1206
static LRESULT WAVEMAP_drvOpen(LPSTR str)
Definition: wavemap.c:1191

◆ WAVEMAP_drvClose()

static LRESULT WAVEMAP_drvClose ( DWORD_PTR  dwDevID)
static

Definition at line 1206 of file wavemap.c.

1207{
1208 TRACE("(%08Ix)\n", dwDevID);
1209
1210 if (oss) {
1211 oss = NULL;
1212 return 1;
1213 }
1214 return 0;
1215}
#define NULL
Definition: types.h:112
static struct WINE_WAVEMAP * oss
Definition: wavemap.c:1186

Referenced by WAVEMAP_DriverProc().

◆ WAVEMAP_drvOpen()

static LRESULT WAVEMAP_drvOpen ( LPSTR  str)
static

Definition at line 1191 of file wavemap.c.

1192{
1193 TRACE("(%p)\n", str);
1194
1195 if (oss)
1196 return 0;
1197
1198 /* I know, this is ugly, but who cares... */
1199 oss = (struct WINE_WAVEMAP*)1;
1200 return 1;
1201}
const WCHAR * str

Referenced by WAVEMAP_DriverProc().

◆ WAVEMAP_IsData()

static BOOL WAVEMAP_IsData ( const WAVEMAPDATA *  wm)
static

Definition at line 69 of file wavemap.c.

70{
71 return (!IsBadReadPtr(wm, sizeof(WAVEMAPDATA)) && wm->self == wm);
72}
BOOL WINAPI IsBadReadPtr(IN LPCVOID lp, IN UINT_PTR ucb)
Definition: except.c:805
struct tagWAVEMAPDATA * self
Definition: wavemap.c:45

Referenced by widCallback(), widGetDevCaps(), wodCallback(), wodGetDevCaps(), wodGetVolume(), and wodSetVolume().

◆ WAVEMAP_widMessage()

DWORD WINAPI WAVEMAP_widMessage ( WORD  wDevID,
WORD  wMsg,
DWORD_PTR  dwUser,
DWORD_PTR  dwParam1,
DWORD_PTR  dwParam2 
)

Definition at line 1144 of file wavemap.c.

1146{
1147 TRACE("(%u, %04X, %08IX, %08IX, %08IX);\n",
1148 wDevID, wMsg, dwUser, dwParam1, dwParam2);
1149
1150 switch (wMsg) {
1151 case DRVM_INIT:
1152 case DRVM_EXIT:
1153 case DRVM_ENABLE:
1154 case DRVM_DISABLE:
1155 /* FIXME: Pretend this is supported */
1156 return 0;
1157
1158 case WIDM_OPEN: return widOpen ((DWORD_PTR*)dwUser, (LPWAVEOPENDESC)dwParam1, dwParam2);
1159 case WIDM_CLOSE: return widClose ((WAVEMAPDATA*)dwUser);
1160
1161 case WIDM_ADDBUFFER: return widAddBuffer ((WAVEMAPDATA*)dwUser, (LPWAVEHDR)dwParam1, dwParam2);
1162 case WIDM_PREPARE: return widPrepare ((WAVEMAPDATA*)dwUser, (LPWAVEHDR)dwParam1, dwParam2);
1163 case WIDM_UNPREPARE: return widUnprepare ((WAVEMAPDATA*)dwUser, (LPWAVEHDR)dwParam1, dwParam2);
1164 case WIDM_GETDEVCAPS: return widGetDevCaps (wDevID, (WAVEMAPDATA*)dwUser, (LPWAVEINCAPSW)dwParam1, dwParam2);
1165 case WIDM_GETNUMDEVS: return 1;
1166 case WIDM_GETPOS: return widGetPosition ((WAVEMAPDATA*)dwUser, (LPMMTIME)dwParam1, dwParam2);
1167 case WIDM_RESET: return widReset ((WAVEMAPDATA*)dwUser);
1168 case WIDM_START: return widStart ((WAVEMAPDATA*)dwUser);
1169 case WIDM_STOP: return widStop ((WAVEMAPDATA*)dwUser);
1170 case WIDM_MAPPER_STATUS: return widMapperStatus ((WAVEMAPDATA*)dwUser, dwParam1, (LPVOID)dwParam2);
1171 case DRVM_MAPPER_RECONFIGURE: return widMapperReconfigure((WAVEMAPDATA*)dwUser, dwParam1, dwParam2);
1172 /* known but not supported */
1175 return MMSYSERR_NOTSUPPORTED;
1176 default:
1177 FIXME("unknown message %u!\n", wMsg);
1178 }
1179 return MMSYSERR_NOTSUPPORTED;
1180}
#define FIXME(fmt,...)
Definition: precomp.h:53
#define DRV_QUERYDEVICEINTERFACESIZE
Definition: mmddk.h:97
#define DRVM_INIT
Definition: mmddk.h:56
#define WIDM_GETNUMDEVS
Definition: mmddk.h:136
#define WIDM_STOP
Definition: mmddk.h:144
#define WIDM_MAPPER_STATUS
Definition: mmddk.h:148
#define DRVM_DISABLE
Definition: mmddk.h:58
#define DRVM_ENABLE
Definition: mmddk.h:59
#define WIDM_START
Definition: mmddk.h:143
#define DRVM_MAPPER_RECONFIGURE
Definition: mmddk.h:85
#define WIDM_GETDEVCAPS
Definition: mmddk.h:137
#define WIDM_CLOSE
Definition: mmddk.h:139
#define WIDM_PREPARE
Definition: mmddk.h:140
#define DRVM_EXIT
Definition: mmddk.h:57
#define WIDM_GETPOS
Definition: mmddk.h:146
#define WIDM_ADDBUFFER
Definition: mmddk.h:142
#define DRV_QUERYDEVICEINTERFACE
Definition: mmddk.h:96
#define WIDM_RESET
Definition: mmddk.h:145
#define WIDM_UNPREPARE
Definition: mmddk.h:141
#define WIDM_OPEN
Definition: mmddk.h:138
#define MMSYSERR_NOTSUPPORTED
Definition: mmsystem.h:104
uint32_t DWORD_PTR
Definition: typedefs.h:65
static DWORD widOpen(DWORD_PTR *lpdwUser, LPWAVEOPENDESC lpDesc, DWORD dwFlags)
Definition: wavemap.c:739
static DWORD widStop(WAVEMAPDATA *wim)
Definition: wavemap.c:1084
static DWORD widReset(WAVEMAPDATA *wim)
Definition: wavemap.c:1098
static DWORD widMapperStatus(WAVEMAPDATA *wim, DWORD flags, LPVOID ptr)
Definition: wavemap.c:1105
static DWORD widClose(WAVEMAPDATA *wim)
Definition: wavemap.c:866
static DWORD widStart(WAVEMAPDATA *wim)
Definition: wavemap.c:1091
static DWORD widMapperReconfigure(WAVEMAPDATA *wim, DWORD dwParam1, DWORD dwParam2)
Definition: wavemap.c:1134
static DWORD widAddBuffer(WAVEMAPDATA *wim, LPWAVEHDR lpWaveHdrDst, DWORD dwParam2)
Definition: wavemap.c:884
static DWORD widPrepare(WAVEMAPDATA *wim, LPWAVEHDR lpWaveHdrDst, DWORD dwParam2)
Definition: wavemap.c:902
static DWORD widGetDevCaps(UINT wDevID, WAVEMAPDATA *wim, LPWAVEINCAPSW lpWaveCaps, DWORD dwParam2)
Definition: wavemap.c:1049
static DWORD widGetPosition(WAVEMAPDATA *wim, LPMMTIME lpTime, DWORD dwParam2)
Definition: wavemap.c:987
static DWORD widUnprepare(WAVEMAPDATA *wim, LPWAVEHDR lpWaveHdrDst, DWORD dwParam2)
Definition: wavemap.c:964

◆ WAVEMAP_wodMessage()

DWORD WINAPI WAVEMAP_wodMessage ( UINT  wDevID,
UINT  wMsg,
DWORD_PTR  dwUser,
DWORD_PTR  dwParam1,
DWORD_PTR  dwParam2 
)

Definition at line 615 of file wavemap.c.

617{
618 TRACE("(%u, %04X, %08IX, %08IX, %08IX);\n",
619 wDevID, wMsg, dwUser, dwParam1, dwParam2);
620
621 switch (wMsg) {
622 case DRVM_INIT:
623 case DRVM_EXIT:
624 case DRVM_ENABLE:
625 case DRVM_DISABLE:
626 /* FIXME: Pretend this is supported */
627 return 0;
628 case WODM_OPEN: return wodOpen ((DWORD_PTR*)dwUser, (LPWAVEOPENDESC)dwParam1,dwParam2);
629 case WODM_CLOSE: return wodClose ((WAVEMAPDATA*)dwUser);
630 case WODM_WRITE: return wodWrite ((WAVEMAPDATA*)dwUser, (LPWAVEHDR)dwParam1, dwParam2);
631 case WODM_PAUSE: return wodPause ((WAVEMAPDATA*)dwUser);
632 case WODM_GETPOS: return wodGetPosition ((WAVEMAPDATA*)dwUser, (LPMMTIME)dwParam1, dwParam2);
633 case WODM_BREAKLOOP: return wodBreakLoop ((WAVEMAPDATA*)dwUser);
634 case WODM_PREPARE: return wodPrepare ((WAVEMAPDATA*)dwUser, (LPWAVEHDR)dwParam1, dwParam2);
635 case WODM_UNPREPARE: return wodUnprepare ((WAVEMAPDATA*)dwUser, (LPWAVEHDR)dwParam1, dwParam2);
636 case WODM_GETDEVCAPS: return wodGetDevCaps (wDevID, (WAVEMAPDATA*)dwUser, (LPWAVEOUTCAPSW)dwParam1,dwParam2);
637 case WODM_GETNUMDEVS: return 1;
642 case WODM_GETVOLUME: return wodGetVolume (wDevID, (WAVEMAPDATA*)dwUser, (LPDWORD)dwParam1);
643 case WODM_SETVOLUME: return wodSetVolume (wDevID, (WAVEMAPDATA*)dwUser, dwParam1);
644 case WODM_RESTART: return wodRestart ((WAVEMAPDATA*)dwUser);
645 case WODM_RESET: return wodReset ((WAVEMAPDATA*)dwUser);
646 case WODM_MAPPER_STATUS: return wodMapperStatus ((WAVEMAPDATA*)dwUser, dwParam1, (LPVOID)dwParam2);
647 case DRVM_MAPPER_RECONFIGURE: return wodMapperReconfigure((WAVEMAPDATA*)dwUser, dwParam1, dwParam2);
648 /* known but not supported */
652 default:
653 FIXME("unknown message %d!\n", wMsg);
654 }
656}
#define WODM_PREPARE
Definition: mmddk.h:112
#define WODM_SETVOLUME
Definition: mmddk.h:122
#define WODM_MAPPER_STATUS
Definition: mmddk.h:128
#define WODM_OPEN
Definition: mmddk.h:110
#define WODM_RESET
Definition: mmddk.h:117
#define WODM_GETVOLUME
Definition: mmddk.h:121
#define WODM_WRITE
Definition: mmddk.h:114
#define WODM_RESTART
Definition: mmddk.h:116
#define WODM_GETNUMDEVS
Definition: mmddk.h:108
#define WODM_GETPITCH
Definition: mmddk.h:119
#define WODM_SETPLAYBACKRATE
Definition: mmddk.h:124
#define WODM_GETPOS
Definition: mmddk.h:118
#define WODM_SETPITCH
Definition: mmddk.h:120
#define WODM_GETPLAYBACKRATE
Definition: mmddk.h:123
#define WODM_GETDEVCAPS
Definition: mmddk.h:109
#define WODM_CLOSE
Definition: mmddk.h:111
#define WODM_UNPREPARE
Definition: mmddk.h:113
#define WODM_PAUSE
Definition: mmddk.h:115
#define WODM_BREAKLOOP
Definition: mmddk.h:125
uint32_t * LPDWORD
Definition: typedefs.h:59
static DWORD wodClose(WAVEMAPDATA *wom)
Definition: wavemap.c:295
static DWORD wodRestart(WAVEMAPDATA *wom)
Definition: wavemap.c:555
static DWORD wodMapperReconfigure(WAVEMAPDATA *wom, DWORD dwParam1, DWORD dwParam2)
Definition: wavemap.c:605
static DWORD wodBreakLoop(WAVEMAPDATA *wom)
Definition: wavemap.c:569
static DWORD wodUnprepare(WAVEMAPDATA *wom, LPWAVEHDR lpWaveHdrSrc, DWORD dwParam2)
Definition: wavemap.c:409
static DWORD wodGetVolume(UINT wDevID, WAVEMAPDATA *wom, LPDWORD lpVol)
Definition: wavemap.c:530
static DWORD wodGetDevCaps(UINT wDevID, WAVEMAPDATA *wom, LPWAVEOUTCAPSW lpWaveCaps, DWORD dwParam2)
Definition: wavemap.c:494
static DWORD wodPause(WAVEMAPDATA *wom)
Definition: wavemap.c:548
static DWORD wodSetVolume(UINT wDevID, WAVEMAPDATA *wom, DWORD vol)
Definition: wavemap.c:539
static DWORD wodReset(WAVEMAPDATA *wom)
Definition: wavemap.c:562
static DWORD wodPrepare(WAVEMAPDATA *wom, LPWAVEHDR lpWaveHdrSrc, DWORD dwParam2)
Definition: wavemap.c:348
static DWORD wodOpen(DWORD_PTR *lpdwUser, LPWAVEOPENDESC lpDesc, DWORD dwFlags)
Definition: wavemap.c:151
static DWORD wodMapperStatus(WAVEMAPDATA *wom, DWORD flags, LPVOID ptr)
Definition: wavemap.c:576
static DWORD wodWrite(WAVEMAPDATA *wom, LPWAVEHDR lpWaveHdrSrc, DWORD dwParam2)
Definition: wavemap.c:313
static DWORD wodGetPosition(WAVEMAPDATA *wom, LPMMTIME lpTime, DWORD dwParam2)
Definition: wavemap.c:432

◆ widAddBuffer()

static DWORD widAddBuffer ( WAVEMAPDATA *  wim,
LPWAVEHDR  lpWaveHdrDst,
DWORD  dwParam2 
)
static

Definition at line 884 of file wavemap.c.

885{
887 LPWAVEHDR lpWaveHdrSrc;
888
889 TRACE("(%p %p %08lx)\n", wim, lpWaveHdrDst, dwParam2);
890
891 if (!wim->hAcmStream) {
892 return waveInAddBuffer(wim->u.in.hInnerWave, lpWaveHdrDst, dwParam2);
893 }
894
895 lpWaveHdrDst->dwFlags |= WHDR_INQUEUE;
896 ash = (PACMSTREAMHEADER)lpWaveHdrDst->reserved;
897
898 lpWaveHdrSrc = (LPWAVEHDR)((LPSTR)ash + sizeof(ACMSTREAMHEADER));
899 return waveInAddBuffer(wim->u.in.hInnerWave, lpWaveHdrSrc, sizeof(*lpWaveHdrSrc));
900}
#define WHDR_INQUEUE
Definition: mmsystem.h:197
struct _ACMSTREAMHEADER * PACMSTREAMHEADER
HACMSTREAM hAcmStream
Definition: wavemap.c:56
struct tagWAVEMAPDATA::@596::@598 in
union tagWAVEMAPDATA::@596 u
DWORD dwFlags
Definition: mmsystem.h:1020
DWORD_PTR reserved
Definition: mmsystem.h:1023
UINT WINAPI waveInAddBuffer(HWAVEIN hWaveIn, WAVEHDR *lpWaveInHdr, UINT uSize)
Definition: winmm.c:2717

Referenced by WAVEMAP_widMessage().

◆ widCallback()

static void CALLBACK widCallback ( HWAVEIN  hWave,
UINT  uMsg,
DWORD_PTR  dwInstance,
DWORD_PTR  dwParam1,
DWORD_PTR  dwParam2 
)
static

Definition at line 662 of file wavemap.c.

664{
665 WAVEMAPDATA* wim = (WAVEMAPDATA*)dwInstance;
666
667 TRACE("(%p %u %Ix %Ix %Ix);\n", hWave, uMsg, dwInstance, dwParam1, dwParam2);
668
669 if (!WAVEMAP_IsData(wim)) {
670 ERR("Bad data\n");
671 return;
672 }
673
674 if (uMsg != WIM_OPEN && hWave != wim->u.in.hInnerWave)
675 ERR("Shouldn't happen (%p %p)\n", hWave, wim->u.in.hInnerWave);
676
677 switch (uMsg) {
678 case WIM_OPEN:
679 case WIM_CLOSE:
680 /* dwParam1 & dwParam2 are supposed to be 0, nothing to do */
681 break;
682 case WIM_DATA:
683 if (wim->hAcmStream) {
684 LPWAVEHDR lpWaveHdrSrc = (LPWAVEHDR)dwParam1;
685 PACMSTREAMHEADER ash = (PACMSTREAMHEADER)((LPSTR)lpWaveHdrSrc - sizeof(ACMSTREAMHEADER));
686 LPWAVEHDR lpWaveHdrDst = (LPWAVEHDR)ash->dwUser;
687
688 /* convert data just gotten from waveIn into requested format */
690 ERR("ACM conversion failed\n");
691 return;
692 } else {
693 TRACE("Converted %ld bytes into %ld\n", ash->cbSrcLengthUsed, ash->cbDstLengthUsed);
694 }
695 /* and setup the wavehdr to return accordingly */
696 lpWaveHdrDst->dwFlags &= ~WHDR_INQUEUE;
697 lpWaveHdrDst->dwFlags |= WHDR_DONE;
698 lpWaveHdrDst->dwBytesRecorded = ash->cbDstLengthUsed;
699 dwParam1 = (DWORD_PTR)lpWaveHdrDst;
700 }
701 break;
702 default:
703 ERR("Unknown msg %u\n", uMsg);
704 }
705
706 DriverCallback(wim->dwCallback, HIWORD(wim->dwFlags), (HDRVR)wim->u.in.hOuterWave,
707 uMsg, wim->dwClientInstance, dwParam1, dwParam2);
708}
#define ERR(fmt,...)
Definition: precomp.h:57
BOOL WINAPI DriverCallback(DWORD dwCallBack, UINT uFlags, HDRVR hDev, UINT wMsg, DWORD dwUser, DWORD dwParam1, DWORD dwParam2)
MMRESULT WINAPI acmStreamConvert(HACMSTREAM has, PACMSTREAMHEADER pash, DWORD fdwConvert)
Definition: stream.c:89
#define L(x)
Definition: resources.c:13
HWAVEOUT hWave
Definition: main.h:78
if(dx< 0)
Definition: linetemp.h:194
struct wavehdr_tag * LPWAVEHDR
#define WIM_DATA
Definition: mmsystem.h:186
#define WIM_CLOSE
Definition: mmsystem.h:185
#define WIM_OPEN
Definition: mmsystem.h:184
#define WHDR_DONE
Definition: mmsystem.h:193
struct _ACMSTREAMHEADER ACMSTREAMHEADER
DWORD cbSrcLengthUsed
Definition: msacm.h:555
DWORD_PTR dwUser
Definition: msacm.h:552
DWORD cbDstLengthUsed
Definition: msacm.h:559
DWORD dwFlags
Definition: wavemap.c:60
DWORD_PTR dwClientInstance
Definition: wavemap.c:59
DWORD_PTR dwCallback
Definition: wavemap.c:58
DWORD dwBytesRecorded
Definition: mmsystem.h:1018
#define DWORD_PTR
Definition: treelist.c:76
#define HIWORD(l)
Definition: typedefs.h:247
static BOOL WAVEMAP_IsData(const WAVEMAPDATA *wm)
Definition: wavemap.c:69

Referenced by widOpen(), and widOpenHelper().

◆ widClose()

static DWORD widClose ( WAVEMAPDATA *  wim)
static

Definition at line 866 of file wavemap.c.

867{
868 DWORD ret;
869
870 TRACE("(%p)\n", wim);
871
872 ret = waveInClose(wim->u.in.hInnerWave);
873 if (ret == MMSYSERR_NOERROR) {
874 if (wim->hAcmStream) {
875 ret = acmStreamClose(wim->hAcmStream, 0);
876 }
877 if (ret == MMSYSERR_NOERROR) {
878 HeapFree(GetProcessHeap(), 0, wim);
879 }
880 }
881 return ret;
882}
#define GetProcessHeap()
Definition: compat.h:736
#define HeapFree(x, y, z)
Definition: compat.h:735
MMRESULT WINAPI acmStreamClose(HACMSTREAM has, DWORD fdwClose)
Definition: stream.c:65
return ret
Definition: mutex.c:147
unsigned long DWORD
Definition: ntddk_ex.h:95
UINT WINAPI waveInClose(HWAVEIN hWaveIn)
Definition: winmm.c:2634

Referenced by WAVEMAP_widMessage().

◆ widGetDevCaps()

static DWORD widGetDevCaps ( UINT  wDevID,
WAVEMAPDATA *  wim,
LPWAVEINCAPSW  lpWaveCaps,
DWORD  dwParam2 
)
static

Definition at line 1049 of file wavemap.c.

1050{
1051 TRACE("(%04x, %p %p %08lx)\n", wDevID, wim, lpWaveCaps, dwParam2);
1052
1053 /* if opened low driver, forward message */
1054 if (WAVEMAP_IsData(wim))
1055 return waveInGetDevCapsW((UINT_PTR)wim->u.in.hInnerWave, lpWaveCaps, dwParam2);
1056 /* else if no drivers, nothing to map so return bad device */
1057 if (waveInGetNumDevs() == 0) {
1058 WARN("bad device id\n");
1059 return MMSYSERR_BADDEVICEID;
1060 }
1061 /* otherwise, return caps of mapper itself */
1062 if (wDevID == (UINT)-1 || wDevID == (UINT16)-1) {
1063 WAVEINCAPSW wic;
1064 wic.wMid = 0x00FF;
1065 wic.wPid = 0x0001;
1066 wic.vDriverVersion = 0x0001;
1067 lstrcpyW(wic.szPname, L"Wine wave in mapper");
1068 wic.dwFormats =
1074 wic.wChannels = 2;
1075 wic.wReserved1 = 0;
1076 memcpy(lpWaveCaps, &wic, min(dwParam2, sizeof(wic)));
1077
1078 return MMSYSERR_NOERROR;
1079 }
1080 ERR("This shouldn't happen\n");
1081 return MMSYSERR_ERROR;
1082}
unsigned short UINT16
Definition: actypes.h:129
#define WARN(fmt,...)
Definition: precomp.h:61
#define lstrcpyW
Definition: compat.h:749
unsigned int UINT
Definition: sysinfo.c:13
#define memcpy(s1, s2, n)
Definition: mkisofs.h:878
#define WAVE_FORMAT_2S08
Definition: mmsystem.h:211
#define WAVE_FORMAT_1M08
Definition: mmsystem.h:206
#define WAVE_FORMAT_2M08
Definition: mmsystem.h:210
#define WAVE_FORMAT_2M16
Definition: mmsystem.h:212
#define WAVE_FORMAT_4S08
Definition: mmsystem.h:215
#define WAVE_FORMAT_1S08
Definition: mmsystem.h:207
#define WAVE_FORMAT_4M16
Definition: mmsystem.h:216
#define WAVE_FORMAT_1S16
Definition: mmsystem.h:209
#define WAVE_FORMAT_4M08
Definition: mmsystem.h:214
#define MMSYSERR_ERROR
Definition: mmsystem.h:97
#define WAVE_FORMAT_4S16
Definition: mmsystem.h:217
#define MMSYSERR_BADDEVICEID
Definition: mmsystem.h:98
#define WAVE_FORMAT_1M16
Definition: mmsystem.h:208
#define WAVE_FORMAT_2S16
Definition: mmsystem.h:213
#define min(a, b)
Definition: monoChain.cc:55
unsigned __int3264 UINT_PTR
Definition: mstsclib_h.h:274
WCHAR szPname[MAXPNAMELEN]
Definition: mmsystem.h:1062
MMVERSION vDriverVersion
Definition: mmsystem.h:1061
DWORD dwFormats
Definition: mmsystem.h:1063
UINT WINAPI waveInGetNumDevs(void)
Definition: winmm.c:2565
UINT WINAPI waveInGetDevCapsW(UINT_PTR uDeviceID, LPWAVEINCAPSW lpCaps, UINT uSize)
Definition: winmm.c:2573
#define WAVE_FORMAT_48S16
Definition: winmm_test.h:23
#define WAVE_FORMAT_48M16
Definition: winmm_test.h:22
#define WAVE_FORMAT_96S08
Definition: winmm_test.h:25
#define WAVE_FORMAT_96M16
Definition: winmm_test.h:26
#define WAVE_FORMAT_96S16
Definition: winmm_test.h:27
#define WAVE_FORMAT_48M08
Definition: winmm_test.h:20
#define WAVE_FORMAT_48S08
Definition: winmm_test.h:21
#define WAVE_FORMAT_96M08
Definition: winmm_test.h:24

Referenced by WAVEMAP_widMessage().

◆ widGetPosition()

static DWORD widGetPosition ( WAVEMAPDATA *  wim,
LPMMTIME  lpTime,
DWORD  dwParam2 
)
static

Definition at line 987 of file wavemap.c.

988{
989 DWORD val;
990 MMTIME timepos;
991 TRACE("(%p %p %08lx)\n", wim, lpTime, dwParam2);
992
993 timepos = *lpTime;
994
995 /* For TIME_MS, we're going to recalculate using TIME_BYTES */
996 if (lpTime->wType == TIME_MS)
997 timepos.wType = TIME_BYTES;
998
999 /* This can change timepos.wType if the requested type is not supported */
1000 val = waveInGetPosition(wim->u.in.hInnerWave, &timepos, dwParam2);
1001
1002 if (timepos.wType == TIME_BYTES)
1003 {
1004 DWORD dwInnerSamplesPerOuter = wim->nSamplesPerSecInner / wim->nSamplesPerSecOuter;
1005 if (dwInnerSamplesPerOuter > 0)
1006 {
1007 DWORD dwInnerBytesPerSample = wim->avgSpeedInner / wim->nSamplesPerSecInner;
1008 DWORD dwInnerBytesPerOuterSample = dwInnerBytesPerSample * dwInnerSamplesPerOuter;
1009 DWORD remainder = 0;
1010
1011 /* If we are up sampling (going from lower sample rate to higher),
1012 ** we need to make a special accommodation for times when we've
1013 ** written a partial output sample. This happens frequently
1014 ** to us because we use msacm to do our up sampling, and it
1015 ** will up sample on an unaligned basis.
1016 ** For example, if you convert a 2 byte wide 8,000 'outer'
1017 ** buffer to a 2 byte wide 48,000 inner device, you would
1018 ** expect 2 bytes of input to produce 12 bytes of output.
1019 ** Instead, msacm will produce 8 bytes of output.
1020 ** But reporting our position as 1 byte of output is
1021 ** nonsensical; the output buffer position needs to be
1022 ** aligned on outer sample size, and aggressively rounded up.
1023 */
1024 remainder = timepos.u.cb % dwInnerBytesPerOuterSample;
1025 if (remainder > 0)
1026 {
1027 timepos.u.cb -= remainder;
1028 timepos.u.cb += dwInnerBytesPerOuterSample;
1029 }
1030 }
1031
1032 lpTime->u.cb = MulDiv(timepos.u.cb, wim->avgSpeedOuter, wim->avgSpeedInner);
1033
1034 /* Once we have the TIME_BYTES right, we can easily convert to TIME_MS */
1035 if (lpTime->wType == TIME_MS)
1036 lpTime->u.ms = MulDiv(lpTime->u.cb, 1000, wim->avgSpeedOuter);
1037 else
1038 lpTime->wType = TIME_BYTES;
1039 }
1040 else if (lpTime->wType == TIME_SAMPLES && timepos.wType == TIME_SAMPLES)
1041 lpTime->u.sample = MulDiv(timepos.u.sample, wim->nSamplesPerSecOuter, wim->nSamplesPerSecInner);
1042 else
1043 /* other time types don't require conversion */
1044 lpTime->u = timepos.u;
1045
1046 return val;
1047}
_ACRTIMP double __cdecl remainder(double, double)
Definition: remainder.c:75
GLuint GLfloat * val
Definition: glext.h:7180
#define TIME_BYTES
Definition: mmsystem.h:30
#define TIME_SAMPLES
Definition: mmsystem.h:29
#define TIME_MS
Definition: mmsystem.h:28
INT WINAPI MulDiv(INT nNumber, INT nNumerator, INT nDenominator)
Definition: muldiv.c:25
DWORD ms
Definition: mmsystem.h:969
DWORD cb
Definition: mmsystem.h:971
union mmtime_tag::@3760 u
DWORD sample
Definition: mmsystem.h:970
UINT wType
Definition: mmsystem.h:967
DWORD nSamplesPerSecOuter
Definition: wavemap.c:65
DWORD avgSpeedOuter
Definition: wavemap.c:62
DWORD avgSpeedInner
Definition: wavemap.c:63
DWORD nSamplesPerSecInner
Definition: wavemap.c:66
UINT WINAPI waveInGetPosition(HWAVEIN hWaveIn, LPMMTIME lpTime, UINT uSize)
Definition: winmm.c:2779

Referenced by WAVEMAP_widMessage().

◆ widMapperReconfigure()

static DWORD widMapperReconfigure ( WAVEMAPDATA *  wim,
DWORD  dwParam1,
DWORD  dwParam2 
)
static

Definition at line 1134 of file wavemap.c.

1135{
1136 FIXME("(%p %08lx %08lx) stub!\n", wim, dwParam1, dwParam2);
1137
1138 return MMSYSERR_NOERROR;
1139}

Referenced by WAVEMAP_widMessage().

◆ widMapperStatus()

static DWORD widMapperStatus ( WAVEMAPDATA *  wim,
DWORD  flags,
LPVOID  ptr 
)
static

Definition at line 1105 of file wavemap.c.

1106{
1107 UINT id;
1109
1110 TRACE("(%p %08lx %p)\n", wim, flags, ptr);
1111
1112 switch (flags) {
1114 ret = waveInGetID(wim->u.in.hInnerWave, &id);
1115 *(LPDWORD)ptr = id;
1116 break;
1118 FIXME("Unsupported yet flag=%ld\n", flags);
1119 *(LPDWORD)ptr = 0; /* FIXME ?? */
1120 break;
1122 FIXME("Unsupported flag=%ld\n", flags);
1123 /* ptr points to a WAVEFORMATEX struct - before or after streaming ? */
1124 *(LPDWORD)ptr = 0; /* FIXME ?? */
1125 break;
1126 default:
1127 FIXME("Unsupported flag=%ld\n", flags);
1128 *(LPDWORD)ptr = 0;
1129 break;
1130 }
1131 return ret;
1132}
#define WAVEIN_MAPPER_STATUS_MAPPED
Definition: mmddk.h:150
#define WAVEIN_MAPPER_STATUS_FORMAT
Definition: mmddk.h:151
#define WAVEIN_MAPPER_STATUS_DEVICE
Definition: mmddk.h:149
GLbitfield flags
Definition: glext.h:7161
GLuint id
Definition: glext.h:5910
static PVOID ptr
Definition: dispmode.c:27
#define LPDWORD
Definition: nt_native.h:46
UINT WINAPI waveInGetID(HWAVEIN hWaveIn, UINT *lpuDeviceID)
Definition: winmm.c:2795

Referenced by WAVEMAP_widMessage().

◆ widOpen()

static DWORD widOpen ( DWORD_PTR *  lpdwUser,
LPWAVEOPENDESC  lpDesc,
DWORD  dwFlags 
)
static

Definition at line 739 of file wavemap.c.

740{
741 UINT ndlo, ndhi;
742 UINT i;
743 WAVEMAPDATA* wim = HeapAlloc(GetProcessHeap(), 0, sizeof(WAVEMAPDATA));
744 DWORD res;
745
746 TRACE("(%p %p %08lx)\n", lpdwUser, lpDesc, dwFlags);
747
748 if (!wim) {
749 WARN("no memory\n");
750 return MMSYSERR_NOMEM;
751 }
752
753 wim->self = wim;
754 wim->dwCallback = lpDesc->dwCallback;
755 wim->dwFlags = dwFlags;
756 wim->dwClientInstance = lpDesc->dwInstance;
757 wim->u.in.hOuterWave = (HWAVEIN)lpDesc->hWave;
758
759 ndhi = waveInGetNumDevs();
760 if (dwFlags & WAVE_MAPPED) {
761 if (lpDesc->uMappedDeviceID >= ndhi) return MMSYSERR_INVALPARAM;
762 ndlo = lpDesc->uMappedDeviceID;
763 ndhi = ndlo + 1;
764 dwFlags &= ~WAVE_MAPPED;
765 } else {
766 ndlo = 0;
767 }
768
771
772 for (i = ndlo; i < ndhi; i++) {
773 if (waveInOpen(&wim->u.in.hInnerWave, i, lpDesc->lpFormat,
776 wim->hAcmStream = 0;
777 goto found;
778 }
779 }
780
781 if ((dwFlags & WAVE_FORMAT_DIRECT) == 0)
782 {
783 WAVEFORMATEX wfx;
784
786 wfx.cbSize = 0; /* normally, this field is not used for PCM format, just in case */
787 /* try some ACM stuff */
788
789#define TRY(sps,bps) wfx.nSamplesPerSec = (sps); wfx.wBitsPerSample = (bps); \
790 switch (res=widOpenHelper(wim, i, lpDesc, &wfx, dwFlags | WAVE_FORMAT_DIRECT)) { \
791 case MMSYSERR_NOERROR: wim->avgSpeedInner = wfx.nAvgBytesPerSec; wim->nSamplesPerSecInner = wfx.nSamplesPerSec; goto found; \
792 case WAVERR_BADFORMAT: break; \
793 default: goto error; \
794 }
795
796 for (i = ndlo; i < ndhi; i++) {
798 /* first try with same stereo/mono option as source */
799 wfx.nChannels = lpDesc->lpFormat->nChannels;
800 TRY(wfx.nSamplesPerSec, 16);
801 TRY(wfx.nSamplesPerSec, 8);
802 wfx.nChannels ^= 3;
803 TRY(wfx.nSamplesPerSec, 16);
804 TRY(wfx.nSamplesPerSec, 8);
805 }
806
807 for (i = ndlo; i < ndhi; i++) {
809 /* first try with same stereo/mono option as source */
810 wfx.nChannels = lpDesc->lpFormat->nChannels;
811 TRY(96000, 16);
812 TRY(48000, 16);
813 TRY(44100, 16);
814 TRY(22050, 16);
815 TRY(11025, 16);
816
817 /* 2^3 => 1, 1^3 => 2, so if stereo, try mono (and the other way around) */
818 wfx.nChannels ^= 3;
819 TRY(96000, 16);
820 TRY(48000, 16);
821 TRY(44100, 16);
822 TRY(22050, 16);
823 TRY(11025, 16);
824
825 /* first try with same stereo/mono option as source */
826 wfx.nChannels = lpDesc->lpFormat->nChannels;
827 TRY(96000, 8);
828 TRY(48000, 8);
829 TRY(44100, 8);
830 TRY(22050, 8);
831 TRY(11025, 8);
832
833 /* 2^3 => 1, 1^3 => 2, so if stereo, try mono (and the other way around) */
834 wfx.nChannels ^= 3;
835 TRY(96000, 8);
836 TRY(48000, 8);
837 TRY(44100, 8);
838 TRY(22050, 8);
839 TRY(11025, 8);
840 }
841#undef TRY
842 }
843
844 HeapFree(GetProcessHeap(), 0, wim);
845 WARN("ret = WAVERR_BADFORMAT\n");
846 return WAVERR_BADFORMAT;
847found:
849 *lpdwUser = 0L;
850 HeapFree(GetProcessHeap(), 0, wim);
851 } else {
852 *lpdwUser = (DWORD_PTR)wim;
853 TRACE("Ok (stream=%p)\n", wim->hAcmStream);
854 }
855 return MMSYSERR_NOERROR;
856error:
857 HeapFree(GetProcessHeap(), 0, wim);
858 if (res==ACMERR_NOTPOSSIBLE) {
859 WARN("ret = WAVERR_BADFORMAT\n");
860 return WAVERR_BADFORMAT;
861 }
862 WARN("ret = 0x%08lx\n", res);
863 return res;
864}
#define WAVE_FORMAT_PCM
Definition: constants.h:425
#define HeapAlloc
Definition: compat.h:733
#define MMSYSERR_NOMEM
Definition: mmsystem.h:103
#define CALLBACK_TYPEMASK
Definition: mmsystem.h:146
#define WAVE_FORMAT_QUERY
Definition: mmsystem.h:188
#define MMSYSERR_INVALPARAM
Definition: mmsystem.h:107
#define WAVE_MAPPED
Definition: mmsystem.h:190
#define CALLBACK_FUNCTION
Definition: mmsystem.h:150
#define ACMERR_NOTPOSSIBLE
Definition: msacm.h:36
DWORD nSamplesPerSec
Definition: audioclient.idl:42
LPWAVEFORMATEX lpFormat
Definition: mmddk.h:399
HWAVE hWave
Definition: mmddk.h:398
DWORD dwInstance
Definition: mmddk.h:401
DWORD dwCallback
Definition: mmddk.h:400
UINT uMappedDeviceID
Definition: mmddk.h:402
DWORD nAvgBytesPerSec
Definition: mmreg.h:81
DWORD nSamplesPerSec
Definition: mmreg.h:80
WORD nChannels
Definition: mmreg.h:79
static void CALLBACK widCallback(HWAVEIN hWave, UINT uMsg, DWORD_PTR dwInstance, DWORD_PTR dwParam1, DWORD_PTR dwParam2)
Definition: wavemap.c:662
#define TRY(sps, bps)
MMRESULT WINAPI waveInOpen(HWAVEIN *lphWaveIn, UINT uDeviceID, LPCWAVEFORMATEX lpFormat, DWORD_PTR dwCallback, DWORD_PTR dwInstance, DWORD dwFlags)
Definition: winmm.c:2623

Referenced by WAVEMAP_widMessage().

◆ widOpenHelper()

static DWORD widOpenHelper ( WAVEMAPDATA *  wim,
UINT  idx,
LPWAVEOPENDESC  lpDesc,
LPWAVEFORMATEX  lpwfx,
DWORD  dwFlags 
)
static

Definition at line 710 of file wavemap.c.

713{
714 DWORD ret;
715
716 TRACE("(%p %04x %p %p %08lx)\n", wim, idx, lpDesc, lpwfx, dwFlags);
717
718 /* source is always PCM, so the formulas below apply */
719 lpwfx->nBlockAlign = (lpwfx->nChannels * lpwfx->wBitsPerSample) / 8;
720 lpwfx->nAvgBytesPerSec = lpwfx->nSamplesPerSec * lpwfx->nBlockAlign;
722 ret = acmStreamOpen(NULL, 0, lpwfx, lpDesc->lpFormat, NULL, 0L, 0L, ACM_STREAMOPENF_QUERY);
723 } else {
724 ret = acmStreamOpen(&wim->hAcmStream, 0, lpwfx, lpDesc->lpFormat, NULL, 0L, 0L, 0L);
725 }
726 if (ret == MMSYSERR_NOERROR) {
727 ret = waveInOpen(&wim->u.in.hInnerWave, idx, lpwfx,
731 acmStreamClose(wim->hAcmStream, 0);
732 wim->hAcmStream = 0;
733 }
734 }
735 TRACE("ret = %08lx\n", ret);
736 return ret;
737}
unsigned int idx
Definition: utils.c:40
MMRESULT WINAPI acmStreamOpen(PHACMSTREAM phas, HACMDRIVER had, PWAVEFORMATEX pwfxSrc, PWAVEFORMATEX pwfxDst, PWAVEFILTER pwfltr, DWORD_PTR dwCallback, DWORD_PTR dwInstance, DWORD fdwOpen)
Definition: stream.c:149
#define ACM_STREAMOPENF_QUERY
Definition: msacm.h:213
WORD nBlockAlign
Definition: mmreg.h:82
WORD wBitsPerSample
Definition: mmreg.h:83

◆ widPrepare()

static DWORD widPrepare ( WAVEMAPDATA *  wim,
LPWAVEHDR  lpWaveHdrDst,
DWORD  dwParam2 
)
static

Definition at line 902 of file wavemap.c.

903{
905 DWORD size;
906 DWORD dwRet;
907 LPWAVEHDR lpWaveHdrSrc;
908
909 TRACE("(%p %p %08lx)\n", wim, lpWaveHdrDst, dwParam2);
910
911 if (!wim->hAcmStream) {
912 return waveInPrepareHeader(wim->u.in.hInnerWave, lpWaveHdrDst, dwParam2);
913 }
914 if (acmStreamSize(wim->hAcmStream, lpWaveHdrDst->dwBufferLength, &size,
916 WARN("acmStreamSize failed\n");
917 return MMSYSERR_ERROR;
918 }
919
920 ash = HeapAlloc(GetProcessHeap(), 0, sizeof(ACMSTREAMHEADER) + sizeof(WAVEHDR) + size);
921 if (ash == NULL) {
922 WARN("no memory\n");
923 return MMSYSERR_NOMEM;
924 }
925
926 ash->cbStruct = sizeof(*ash);
927 ash->fdwStatus = 0L;
928 ash->dwUser = (DWORD_PTR)lpWaveHdrDst;
929 ash->pbSrc = (LPBYTE)ash + sizeof(ACMSTREAMHEADER) + sizeof(WAVEHDR);
930 ash->cbSrcLength = size;
931 /* ash->cbSrcLengthUsed */
932 ash->dwSrcUser = 0L; /* FIXME ? */
933 ash->pbDst = (LPBYTE)lpWaveHdrDst->lpData;
934 ash->cbDstLength = lpWaveHdrDst->dwBufferLength;
935 /* ash->cbDstLengthUsed */
936 ash->dwDstUser = lpWaveHdrDst->dwUser; /* FIXME ? */
937 dwRet = acmStreamPrepareHeader(wim->hAcmStream, ash, 0L);
938 if (dwRet != MMSYSERR_NOERROR) {
939 WARN("acmStreamPrepareHeader failed\n");
940 goto errCleanUp;
941 }
942
943 lpWaveHdrSrc = (LPWAVEHDR)((LPSTR)ash + sizeof(ACMSTREAMHEADER));
944 lpWaveHdrSrc->lpData = (LPSTR)ash->pbSrc;
945 lpWaveHdrSrc->dwBufferLength = size; /* conversion is not done yet */
946 lpWaveHdrSrc->dwFlags = 0;
947 lpWaveHdrSrc->dwLoops = 0;
948 dwRet = waveInPrepareHeader(wim->u.in.hInnerWave, lpWaveHdrSrc, sizeof(*lpWaveHdrSrc));
949 if (dwRet != MMSYSERR_NOERROR) {
950 WARN("waveInPrepareHeader failed\n");
951 goto errCleanUp;
952 }
953
954 lpWaveHdrDst->reserved = (DWORD_PTR)ash;
955 lpWaveHdrDst->dwFlags = WHDR_PREPARED;
956 TRACE("=> (0)\n");
957 return MMSYSERR_NOERROR;
958errCleanUp:
959 TRACE("=> (%ld)\n", dwRet);
960 HeapFree(GetProcessHeap(), 0, ash);
961 return dwRet;
962}
MMRESULT WINAPI acmStreamPrepareHeader(HACMSTREAM has, PACMSTREAMHEADER pash, DWORD fdwPrepare)
Definition: stream.c:299
MMRESULT WINAPI acmStreamSize(HACMSTREAM has, DWORD cbInput, LPDWORD pdwOutputBytes, DWORD fdwSize)
Definition: stream.c:394
GLsizeiptr size
Definition: glext.h:5919
struct wavehdr_tag WAVEHDR
#define WHDR_PREPARED
Definition: mmsystem.h:194
#define ACM_STREAMSIZEF_DESTINATION
Definition: msacm.h:218
DWORD fdwStatus
Definition: msacm.h:551
DWORD cbStruct
Definition: msacm.h:550
LPBYTE pbDst
Definition: msacm.h:557
DWORD cbDstLength
Definition: msacm.h:558
DWORD cbSrcLength
Definition: msacm.h:554
DWORD_PTR dwDstUser
Definition: msacm.h:560
LPBYTE pbSrc
Definition: msacm.h:553
DWORD_PTR dwSrcUser
Definition: msacm.h:556
DWORD dwBufferLength
Definition: mmsystem.h:1017
DWORD dwLoops
Definition: mmsystem.h:1021
DWORD_PTR dwUser
Definition: mmsystem.h:1019
LPSTR lpData
Definition: mmsystem.h:1016
unsigned char * LPBYTE
Definition: typedefs.h:53
UINT WINAPI waveInPrepareHeader(HWAVEIN hWaveIn, WAVEHDR *lpWaveInHdr, UINT uSize)
Definition: winmm.c:2653

Referenced by WAVEMAP_widMessage().

◆ widReset()

static DWORD widReset ( WAVEMAPDATA *  wim)
static

Definition at line 1098 of file wavemap.c.

1099{
1100 TRACE("(%p)\n", wim);
1101
1102 return waveInReset(wim->u.in.hInnerWave);
1103}
UINT WINAPI waveInReset(HWAVEIN hWaveIn)
Definition: winmm.c:2734

Referenced by WAVEMAP_widMessage().

◆ widStart()

static DWORD widStart ( WAVEMAPDATA *  wim)
static

Definition at line 1091 of file wavemap.c.

1092{
1093 TRACE("(%p)\n", wim);
1094
1095 return waveInStart(wim->u.in.hInnerWave);
1096}
UINT WINAPI waveInStart(HWAVEIN hWaveIn)
Definition: winmm.c:2749

Referenced by WAVEMAP_widMessage().

◆ widStop()

static DWORD widStop ( WAVEMAPDATA *  wim)
static

Definition at line 1084 of file wavemap.c.

1085{
1086 TRACE("(%p)\n", wim);
1087
1088 return waveInStop(wim->u.in.hInnerWave);
1089}
UINT WINAPI waveInStop(HWAVEIN hWaveIn)
Definition: winmm.c:2764

Referenced by WAVEMAP_widMessage().

◆ widUnprepare()

static DWORD widUnprepare ( WAVEMAPDATA *  wim,
LPWAVEHDR  lpWaveHdrDst,
DWORD  dwParam2 
)
static

Definition at line 964 of file wavemap.c.

965{
967 LPWAVEHDR lpWaveHdrSrc;
968 DWORD dwRet1, dwRet2;
969
970 TRACE("(%p %p %08lx)\n", wim, lpWaveHdrDst, dwParam2);
971
972 if (!wim->hAcmStream) {
973 return waveInUnprepareHeader(wim->u.in.hInnerWave, lpWaveHdrDst, dwParam2);
974 }
975 ash = (PACMSTREAMHEADER)lpWaveHdrDst->reserved;
976 dwRet1 = acmStreamUnprepareHeader(wim->hAcmStream, ash, 0L);
977
978 lpWaveHdrSrc = (LPWAVEHDR)((LPSTR)ash + sizeof(ACMSTREAMHEADER));
979 dwRet2 = waveInUnprepareHeader(wim->u.in.hInnerWave, lpWaveHdrSrc, sizeof(*lpWaveHdrSrc));
980
981 HeapFree(GetProcessHeap(), 0, ash);
982
983 lpWaveHdrDst->dwFlags &= ~WHDR_PREPARED;
984 return (dwRet1 == MMSYSERR_NOERROR) ? dwRet2 : dwRet1;
985}
MMRESULT WINAPI acmStreamUnprepareHeader(HACMSTREAM has, PACMSTREAMHEADER pash, DWORD fdwUnprepare)
Definition: stream.c:449
UINT WINAPI waveInUnprepareHeader(HWAVEIN hWaveIn, WAVEHDR *lpWaveInHdr, UINT uSize)
Definition: winmm.c:2684

Referenced by WAVEMAP_widMessage().

◆ WINE_DEFAULT_DEBUG_CHANNEL()

WINE_DEFAULT_DEBUG_CHANNEL ( wavemap  )

◆ wodBreakLoop()

static DWORD wodBreakLoop ( WAVEMAPDATA *  wom)
static

Definition at line 569 of file wavemap.c.

570{
571 TRACE("(%p)\n",wom);
572
573 return waveOutBreakLoop(wom->u.out.hInnerWave);
574}
struct tagWAVEMAPDATA::@596::@597 out
UINT WINAPI waveOutBreakLoop(HWAVEOUT hWaveOut)
Definition: winmm.c:2357

Referenced by WAVEMAP_wodMessage().

◆ wodCallback()

static void CALLBACK wodCallback ( HWAVEOUT  hWave,
UINT  uMsg,
DWORD_PTR  dwInstance,
DWORD_PTR  dwParam1,
DWORD_PTR  dwParam2 
)
static

Definition at line 78 of file wavemap.c.

80{
81 WAVEMAPDATA* wom = (WAVEMAPDATA*)dwInstance;
82
83 TRACE("(%p %u %Id %Ix %Ix);\n", hWave, uMsg, dwInstance, dwParam1, dwParam2);
84
85 if (!WAVEMAP_IsData(wom)) {
86 ERR("Bad data\n");
87 return;
88 }
89
90 if (uMsg != WOM_OPEN && hWave != wom->u.out.hInnerWave)
91 ERR("Shouldn't happen (%p %p)\n", hWave, wom->u.out.hInnerWave);
92
93 switch (uMsg) {
94 case WOM_OPEN:
95 case WOM_CLOSE:
96 /* dwParam1 & dwParam2 are supposed to be 0, nothing to do */
97 break;
98 case WOM_DONE:
99 if (wom->hAcmStream) {
100 LPWAVEHDR lpWaveHdrDst = (LPWAVEHDR)dwParam1;
101 PACMSTREAMHEADER ash = (PACMSTREAMHEADER)((LPSTR)lpWaveHdrDst - sizeof(ACMSTREAMHEADER));
102 LPWAVEHDR lpWaveHdrSrc = (LPWAVEHDR)ash->dwUser;
103
104 lpWaveHdrSrc->dwFlags &= ~WHDR_INQUEUE;
105 lpWaveHdrSrc->dwFlags |= WHDR_DONE;
106 dwParam1 = (DWORD_PTR)lpWaveHdrSrc;
107 }
108 break;
109 default:
110 ERR("Unknown msg %u\n", uMsg);
111 }
112
113 DriverCallback(wom->dwCallback, HIWORD(wom->dwFlags), (HDRVR)wom->u.out.hOuterWave,
114 uMsg, wom->dwClientInstance, dwParam1, dwParam2);
115}
#define WOM_DONE
Definition: mmsystem.h:183
#define WOM_OPEN
Definition: mmsystem.h:181
#define WOM_CLOSE
Definition: mmsystem.h:182

Referenced by wodOpen(), and wodOpenHelper().

◆ wodClose()

static DWORD wodClose ( WAVEMAPDATA *  wom)
static

Definition at line 295 of file wavemap.c.

296{
297 DWORD ret;
298
299 TRACE("(%p)\n", wom);
300
301 ret = waveOutClose(wom->u.out.hInnerWave);
302 if (ret == MMSYSERR_NOERROR) {
303 if (wom->hAcmStream) {
304 ret = acmStreamClose(wom->hAcmStream, 0);
305 }
306 if (ret == MMSYSERR_NOERROR) {
307 HeapFree(GetProcessHeap(), 0, wom);
308 }
309 }
310 return ret;
311}
UINT WINAPI waveOutClose(HWAVEOUT hWaveOut)
Definition: winmm.c:2257

Referenced by WAVEMAP_wodMessage().

◆ wodGetDevCaps()

static DWORD wodGetDevCaps ( UINT  wDevID,
WAVEMAPDATA *  wom,
LPWAVEOUTCAPSW  lpWaveCaps,
DWORD  dwParam2 
)
static

Definition at line 494 of file wavemap.c.

495{
496 TRACE("(%04x %p %p %08lx)\n",wDevID, wom, lpWaveCaps, dwParam2);
497
498 /* if opened low driver, forward message */
499 if (WAVEMAP_IsData(wom))
500 return waveOutGetDevCapsW((UINT_PTR)wom->u.out.hInnerWave, lpWaveCaps, dwParam2);
501 /* else if no drivers, nothing to map so return bad device */
502 if (waveOutGetNumDevs() == 0) {
503 WARN("bad device id\n");
505 }
506 /* otherwise, return caps of mapper itself */
507 if (wDevID == (UINT)-1 || wDevID == (UINT16)-1) {
508 WAVEOUTCAPSW woc;
509 woc.wMid = 0x00FF;
510 woc.wPid = 0x0001;
511 woc.vDriverVersion = 0x0332;
512 lstrcpyW(woc.szPname, L"Wine wave out mapper");
513 woc.dwFormats =
519 woc.wChannels = 2;
520 woc.wReserved1 = 0;
522 memcpy(lpWaveCaps, &woc, min(dwParam2, sizeof(woc)));
523
524 return MMSYSERR_NOERROR;
525 }
526 ERR("This shouldn't happen\n");
527 return MMSYSERR_ERROR;
528}
#define WAVECAPS_VOLUME
Definition: mmsystem.h:200
#define WAVECAPS_LRVOLUME
Definition: mmsystem.h:201
MMVERSION vDriverVersion
Definition: mmsystem.h:1040
WCHAR szPname[MAXPNAMELEN]
Definition: mmsystem.h:1041
UINT WINAPI waveOutGetNumDevs(void)
Definition: winmm.c:2137
UINT WINAPI waveOutGetDevCapsW(UINT_PTR uDeviceID, LPWAVEOUTCAPSW lpCaps, UINT uSize)
Definition: winmm.c:2173

Referenced by WAVEMAP_wodMessage().

◆ wodGetPosition()

static DWORD wodGetPosition ( WAVEMAPDATA *  wom,
LPMMTIME  lpTime,
DWORD  dwParam2 
)
static

Definition at line 432 of file wavemap.c.

433{
434 DWORD val;
435 MMTIME timepos;
436 TRACE("(%p %p %08lx)\n", wom, lpTime, dwParam2);
437
438 timepos = *lpTime;
439
440 /* For TIME_MS, we're going to recalculate using TIME_BYTES */
441 if (lpTime->wType == TIME_MS)
442 timepos.wType = TIME_BYTES;
443
444 /* This can change timepos.wType if the requested type is not supported */
445 val = waveOutGetPosition(wom->u.out.hInnerWave, &timepos, dwParam2);
446
447 if (timepos.wType == TIME_BYTES)
448 {
449 DWORD dwInnerSamplesPerOuter = wom->nSamplesPerSecInner / wom->nSamplesPerSecOuter;
450 if (dwInnerSamplesPerOuter > 0)
451 {
452 DWORD dwInnerBytesPerSample = wom->avgSpeedInner / wom->nSamplesPerSecInner;
453 DWORD dwInnerBytesPerOuterSample = dwInnerBytesPerSample * dwInnerSamplesPerOuter;
454 DWORD remainder = 0;
455
456 /* If we are up sampling (going from lower sample rate to higher),
457 ** we need to make a special accommodation for times when we've
458 ** written a partial output sample. This happens frequently
459 ** to us because we use msacm to do our up sampling, and it
460 ** will up sample on an unaligned basis.
461 ** For example, if you convert a 2 byte wide 8,000 'outer'
462 ** buffer to a 2 byte wide 48,000 inner device, you would
463 ** expect 2 bytes of input to produce 12 bytes of output.
464 ** Instead, msacm will produce 8 bytes of output.
465 ** But reporting our position as 1 byte of output is
466 ** nonsensical; the output buffer position needs to be
467 ** aligned on outer sample size, and aggressively rounded up.
468 */
469 remainder = timepos.u.cb % dwInnerBytesPerOuterSample;
470 if (remainder > 0)
471 {
472 timepos.u.cb -= remainder;
473 timepos.u.cb += dwInnerBytesPerOuterSample;
474 }
475 }
476
477 lpTime->u.cb = MulDiv(timepos.u.cb, wom->avgSpeedOuter, wom->avgSpeedInner);
478
479 /* Once we have the TIME_BYTES right, we can easily convert to TIME_MS */
480 if (lpTime->wType == TIME_MS)
481 lpTime->u.ms = MulDiv(lpTime->u.cb, 1000, wom->avgSpeedOuter);
482 else
483 lpTime->wType = TIME_BYTES;
484 }
485 else if (lpTime->wType == TIME_SAMPLES && timepos.wType == TIME_SAMPLES)
486 lpTime->u.sample = MulDiv(timepos.u.sample, wom->nSamplesPerSecOuter, wom->nSamplesPerSecInner);
487 else
488 /* other time types don't require conversion */
489 lpTime->u = timepos.u;
490
491 return val;
492}
UINT WINAPI waveOutGetPosition(HWAVEOUT hWaveOut, LPMMTIME lpTime, UINT uSize)
Definition: winmm.c:2413

Referenced by WAVEMAP_wodMessage().

◆ wodGetVolume()

static DWORD wodGetVolume ( UINT  wDevID,
WAVEMAPDATA *  wom,
LPDWORD  lpVol 
)
static

Definition at line 530 of file wavemap.c.

531{
532 TRACE("(%04x %p %p)\n",wDevID, wom, lpVol);
533
534 if (WAVEMAP_IsData(wom))
535 return waveOutGetVolume(wom->u.out.hInnerWave, lpVol);
536 return MMSYSERR_NOERROR;
537}
UINT WINAPI waveOutGetVolume(HWAVEOUT hWaveOut, LPDWORD lpdw)
Definition: winmm.c:2485

Referenced by WAVEMAP_wodMessage().

◆ wodMapperReconfigure()

static DWORD wodMapperReconfigure ( WAVEMAPDATA *  wom,
DWORD  dwParam1,
DWORD  dwParam2 
)
static

Definition at line 605 of file wavemap.c.

606{
607 FIXME("(%p %08lx %08lx) stub!\n", wom, dwParam1, dwParam2);
608
609 return MMSYSERR_NOERROR;
610}

Referenced by WAVEMAP_wodMessage().

◆ wodMapperStatus()

static DWORD wodMapperStatus ( WAVEMAPDATA *  wom,
DWORD  flags,
LPVOID  ptr 
)
static

Definition at line 576 of file wavemap.c.

577{
578 UINT id;
580
581 TRACE("(%p %08lx %p)\n",wom, flags, ptr);
582
583 switch (flags) {
585 ret = waveOutGetID(wom->u.out.hInnerWave, &id);
586 *(LPDWORD)ptr = id;
587 break;
589 FIXME("Unsupported flag=%ld\n", flags);
590 *(LPDWORD)ptr = 0; /* FIXME ?? */
591 break;
593 FIXME("Unsupported flag=%ld\n", flags);
594 /* ptr points to a WAVEFORMATEX struct - before or after streaming ? */
595 *(LPDWORD)ptr = 0;
596 break;
597 default:
598 FIXME("Unsupported flag=%ld\n", flags);
599 *(LPDWORD)ptr = 0;
600 break;
601 }
602 return ret;
603}
#define WAVEOUT_MAPPER_STATUS_FORMAT
Definition: mmddk.h:131
#define WAVEOUT_MAPPER_STATUS_MAPPED
Definition: mmddk.h:130
#define WAVEOUT_MAPPER_STATUS_DEVICE
Definition: mmddk.h:129
UINT WINAPI waveOutGetID(HWAVEOUT hWaveOut, UINT *lpuDeviceID)
Definition: winmm.c:2520

Referenced by WAVEMAP_wodMessage().

◆ wodOpen()

static DWORD wodOpen ( DWORD_PTR *  lpdwUser,
LPWAVEOPENDESC  lpDesc,
DWORD  dwFlags 
)
static

Definition at line 151 of file wavemap.c.

152{
153 UINT ndlo, ndhi;
154 UINT i;
155 WAVEMAPDATA* wom = HeapAlloc(GetProcessHeap(), 0, sizeof(WAVEMAPDATA));
156 DWORD res;
157
158 TRACE("(%p %p %08lx)\n", lpdwUser, lpDesc, dwFlags);
159
160 if (!wom) {
161 WARN("no memory\n");
162 return MMSYSERR_NOMEM;
163 }
164
165 ndhi = waveOutGetNumDevs();
166 if (dwFlags & WAVE_MAPPED) {
167 if (lpDesc->uMappedDeviceID >= ndhi) {
168 WARN("invalid parameter: dwFlags WAVE_MAPPED\n");
169 HeapFree(GetProcessHeap(), 0, wom);
170 return MMSYSERR_INVALPARAM;
171 }
172 ndlo = lpDesc->uMappedDeviceID;
173 ndhi = ndlo + 1;
174 dwFlags &= ~WAVE_MAPPED;
175 } else {
176 ndlo = 0;
177 }
178 wom->self = wom;
179 wom->dwCallback = lpDesc->dwCallback;
180 wom->dwFlags = dwFlags;
181 wom->dwClientInstance = lpDesc->dwInstance;
182 wom->u.out.hOuterWave = (HWAVEOUT)lpDesc->hWave;
185
186 for (i = ndlo; i < ndhi; i++) {
187 /* if no ACM stuff is involved, no need to handle callbacks at this
188 * level, this will be done transparently
189 */
190 if (waveOutOpen(&wom->u.out.hInnerWave, i, lpDesc->lpFormat,
193 wom->hAcmStream = 0;
194 goto found;
195 }
196 }
197
198 if ((dwFlags & WAVE_FORMAT_DIRECT) == 0) {
199 WAVEFORMATEX wfx;
200
202 wfx.cbSize = 0; /* normally, this field is not used for PCM format, just in case */
203 /* try some ACM stuff */
204
205#define TRY(sps,bps) wfx.nSamplesPerSec = (sps); wfx.wBitsPerSample = (bps); \
206 switch (res=wodOpenHelper(wom, i, lpDesc, &wfx, dwFlags | WAVE_FORMAT_DIRECT)) { \
207 case MMSYSERR_NOERROR: wom->avgSpeedInner = wfx.nAvgBytesPerSec; wom->nSamplesPerSecInner = wfx.nSamplesPerSec; goto found; \
208 case WAVERR_BADFORMAT: break; \
209 default: goto error; \
210 }
211
212 if (lpDesc->lpFormat->wFormatTag != WAVE_FORMAT_PCM) {
213 /* Format changed so keep sample rate and number of channels
214 * the same and just change the bit depth
215 */
216 for (i = ndlo; i < ndhi; i++) {
218 wfx.nChannels = lpDesc->lpFormat->nChannels;
219 TRY(wfx.nSamplesPerSec, 16);
220 TRY(wfx.nSamplesPerSec, 8);
221 }
222 } else {
223 /* Our resampling algorithm is quite primitive so first try
224 * to just change the bit depth and number of channels
225 */
226 for (i = ndlo; i < ndhi; i++) {
228 wfx.nChannels = lpDesc->lpFormat->nChannels;
229 TRY(wfx.nSamplesPerSec, 16);
230 TRY(wfx.nSamplesPerSec, 8);
231 wfx.nChannels ^= 3;
232 TRY(wfx.nSamplesPerSec, 16);
233 TRY(wfx.nSamplesPerSec, 8);
234 }
235
236 for (i = ndlo; i < ndhi; i++) {
237 /* first try with same stereo/mono option as source */
238 wfx.nChannels = lpDesc->lpFormat->nChannels;
239 TRY(96000, 16);
240 TRY(48000, 16);
241 TRY(44100, 16);
242 TRY(22050, 16);
243 TRY(11025, 16);
244
245 /* 2^3 => 1, 1^3 => 2, so if stereo, try mono (and the other way around) */
246 wfx.nChannels ^= 3;
247 TRY(96000, 16);
248 TRY(48000, 16);
249 TRY(44100, 16);
250 TRY(22050, 16);
251 TRY(11025, 16);
252
253 /* first try with same stereo/mono option as source */
254 wfx.nChannels = lpDesc->lpFormat->nChannels;
255 TRY(96000, 8);
256 TRY(48000, 8);
257 TRY(44100, 8);
258 TRY(22050, 8);
259 TRY(11025, 8);
260
261 /* 2^3 => 1, 1^3 => 2, so if stereo, try mono (and the other way around) */
262 wfx.nChannels ^= 3;
263 TRY(96000, 8);
264 TRY(48000, 8);
265 TRY(44100, 8);
266 TRY(22050, 8);
267 TRY(11025, 8);
268 }
269 }
270#undef TRY
271 }
272
273 HeapFree(GetProcessHeap(), 0, wom);
274 WARN("ret = WAVERR_BADFORMAT\n");
275 return WAVERR_BADFORMAT;
276
277found:
279 *lpdwUser = 0L;
280 HeapFree(GetProcessHeap(), 0, wom);
281 } else {
282 *lpdwUser = (DWORD_PTR)wom;
283 }
284 return MMSYSERR_NOERROR;
285error:
286 HeapFree(GetProcessHeap(), 0, wom);
287 if (res==ACMERR_NOTPOSSIBLE) {
288 WARN("ret = WAVERR_BADFORMAT\n");
289 return WAVERR_BADFORMAT;
290 }
291 WARN("ret = 0x%08lx\n", res);
292 return res;
293}
for(i=0;i< sizeof(testsuite)/sizeof(testsuite[0]);++i) ok(call_test(testsuite[i].func)
WORD wFormatTag
Definition: mmreg.h:78
static void CALLBACK wodCallback(HWAVEOUT hWave, UINT uMsg, DWORD_PTR dwInstance, DWORD_PTR dwParam1, DWORD_PTR dwParam2)
Definition: wavemap.c:78
MMRESULT WINAPI waveOutOpen(LPHWAVEOUT lphWaveOut, UINT uDeviceID, LPCWAVEFORMATEX lpFormat, DWORD_PTR dwCallback, DWORD_PTR dwInstance, DWORD dwFlags)
Definition: winmm.c:2246

Referenced by WAVEMAP_wodMessage().

◆ wodOpenHelper()

static DWORD wodOpenHelper ( WAVEMAPDATA *  wom,
UINT  idx,
LPWAVEOPENDESC  lpDesc,
LPWAVEFORMATEX  lpwfx,
DWORD  dwFlags 
)
static

Definition at line 122 of file wavemap.c.

125{
126 DWORD ret;
127
128 TRACE("(%p %04x %p %p %08lx)\n", wom, idx, lpDesc, lpwfx, dwFlags);
129
130 /* destination is always PCM, so the formulas below apply */
131 lpwfx->nBlockAlign = (lpwfx->nChannels * lpwfx->wBitsPerSample) / 8;
132 lpwfx->nAvgBytesPerSec = lpwfx->nSamplesPerSec * lpwfx->nBlockAlign;
134 ret = acmStreamOpen(NULL, 0, lpDesc->lpFormat, lpwfx, NULL, 0L, 0L, ACM_STREAMOPENF_QUERY);
135 } else {
136 ret = acmStreamOpen(&wom->hAcmStream, 0, lpDesc->lpFormat, lpwfx, NULL, 0L, 0L, 0L);
137 }
138 if (ret == MMSYSERR_NOERROR) {
139 ret = waveOutOpen(&wom->u.out.hInnerWave, idx, lpwfx,
143 acmStreamClose(wom->hAcmStream, 0);
144 wom->hAcmStream = 0;
145 }
146 }
147 TRACE("ret = %08lx\n", ret);
148 return ret;
149}

◆ wodPause()

static DWORD wodPause ( WAVEMAPDATA *  wom)
static

Definition at line 548 of file wavemap.c.

549{
550 TRACE("(%p)\n",wom);
551
552 return waveOutPause(wom->u.out.hInnerWave);
553}
UINT WINAPI waveOutPause(HWAVEOUT hWaveOut)
Definition: winmm.c:2371

Referenced by WAVEMAP_wodMessage().

◆ wodPrepare()

static DWORD wodPrepare ( WAVEMAPDATA *  wom,
LPWAVEHDR  lpWaveHdrSrc,
DWORD  dwParam2 
)
static

Definition at line 348 of file wavemap.c.

349{
351 DWORD size;
352 DWORD dwRet;
353 LPWAVEHDR lpWaveHdrDst;
354
355 TRACE("(%p %p %08lx)\n", wom, lpWaveHdrSrc, dwParam2);
356
357 if (!wom->hAcmStream)
358 return waveOutPrepareHeader(wom->u.out.hInnerWave, lpWaveHdrSrc, dwParam2);
359
361 WARN("acmStreamSize failed\n");
362 return MMSYSERR_ERROR;
363 }
364
365 ash = HeapAlloc(GetProcessHeap(), 0, sizeof(ACMSTREAMHEADER) + sizeof(WAVEHDR) + size);
366 if (ash == NULL) {
367 WARN("no memory\n");
368 return MMSYSERR_NOMEM;
369 }
370
371 ash->cbStruct = sizeof(*ash);
372 ash->fdwStatus = 0L;
373 ash->dwUser = (DWORD_PTR)lpWaveHdrSrc;
374 ash->pbSrc = (LPBYTE)lpWaveHdrSrc->lpData;
375 ash->cbSrcLength = lpWaveHdrSrc->dwBufferLength;
376 /* ash->cbSrcLengthUsed */
377 ash->dwSrcUser = lpWaveHdrSrc->dwUser; /* FIXME ? */
378 ash->pbDst = (LPBYTE)ash + sizeof(ACMSTREAMHEADER) + sizeof(WAVEHDR);
379 ash->cbDstLength = size;
380 /* ash->cbDstLengthUsed */
381 ash->dwDstUser = 0; /* FIXME ? */
382 dwRet = acmStreamPrepareHeader(wom->hAcmStream, ash, 0L);
383 if (dwRet != MMSYSERR_NOERROR) {
384 WARN("acmStreamPrepareHeader failed\n");
385 goto errCleanUp;
386 }
387
388 lpWaveHdrDst = (LPWAVEHDR)((LPSTR)ash + sizeof(ACMSTREAMHEADER));
389 lpWaveHdrDst->lpData = (LPSTR)ash->pbDst;
390 lpWaveHdrDst->dwBufferLength = size; /* conversion is not done yet */
391 lpWaveHdrDst->dwFlags = 0;
392 lpWaveHdrDst->dwLoops = 0;
393 dwRet = waveOutPrepareHeader(wom->u.out.hInnerWave, lpWaveHdrDst, sizeof(*lpWaveHdrDst));
394 if (dwRet != MMSYSERR_NOERROR) {
395 WARN("waveOutPrepareHeader failed\n");
396 goto errCleanUp;
397 }
398
399 lpWaveHdrSrc->reserved = (DWORD_PTR)ash;
400 lpWaveHdrSrc->dwFlags = WHDR_PREPARED;
401 TRACE("=> (0)\n");
402 return MMSYSERR_NOERROR;
403errCleanUp:
404 TRACE("=> (%ld)\n", dwRet);
405 HeapFree(GetProcessHeap(), 0, ash);
406 return dwRet;
407}
#define ACM_STREAMSIZEF_SOURCE
Definition: msacm.h:217
UINT WINAPI waveOutPrepareHeader(HWAVEOUT hWaveOut, WAVEHDR *lpWaveOutHdr, UINT uSize)
Definition: winmm.c:2277

Referenced by WAVEMAP_wodMessage().

◆ wodReset()

static DWORD wodReset ( WAVEMAPDATA *  wom)
static

Definition at line 562 of file wavemap.c.

563{
564 TRACE("(%p)\n",wom);
565
566 return waveOutReset(wom->u.out.hInnerWave);
567}
UINT WINAPI waveOutReset(HWAVEOUT hWaveOut)
Definition: winmm.c:2385

Referenced by WAVEMAP_wodMessage().

◆ wodRestart()

static DWORD wodRestart ( WAVEMAPDATA *  wom)
static

Definition at line 555 of file wavemap.c.

556{
557 TRACE("(%p)\n",wom);
558
559 return waveOutRestart(wom->u.out.hInnerWave);
560}
UINT WINAPI waveOutRestart(HWAVEOUT hWaveOut)
Definition: winmm.c:2399

Referenced by WAVEMAP_wodMessage().

◆ wodSetVolume()

static DWORD wodSetVolume ( UINT  wDevID,
WAVEMAPDATA *  wom,
DWORD  vol 
)
static

Definition at line 539 of file wavemap.c.

540{
541 TRACE("(%04x %p %08lx)\n",wDevID, wom, vol);
542
543 if (WAVEMAP_IsData(wom))
544 return waveOutSetVolume(wom->u.out.hInnerWave, vol);
545 return MMSYSERR_NOERROR;
546}
UINT WINAPI waveOutSetVolume(HWAVEOUT hWaveOut, DWORD dw)
Definition: winmm.c:2505

Referenced by WAVEMAP_wodMessage().

◆ wodUnprepare()

static DWORD wodUnprepare ( WAVEMAPDATA *  wom,
LPWAVEHDR  lpWaveHdrSrc,
DWORD  dwParam2 
)
static

Definition at line 409 of file wavemap.c.

410{
412 LPWAVEHDR lpWaveHdrDst;
413 DWORD dwRet1, dwRet2;
414
415 TRACE("(%p %p %08lx)\n", wom, lpWaveHdrSrc, dwParam2);
416
417 if (!wom->hAcmStream) {
418 return waveOutUnprepareHeader(wom->u.out.hInnerWave, lpWaveHdrSrc, dwParam2);
419 }
420 ash = (PACMSTREAMHEADER)lpWaveHdrSrc->reserved;
421 dwRet1 = acmStreamUnprepareHeader(wom->hAcmStream, ash, 0L);
422
423 lpWaveHdrDst = (LPWAVEHDR)((LPSTR)ash + sizeof(ACMSTREAMHEADER));
424 dwRet2 = waveOutUnprepareHeader(wom->u.out.hInnerWave, lpWaveHdrDst, sizeof(*lpWaveHdrDst));
425
426 HeapFree(GetProcessHeap(), 0, ash);
427
428 lpWaveHdrSrc->dwFlags &= ~WHDR_PREPARED;
429 return (dwRet1 == MMSYSERR_NOERROR) ? dwRet2 : dwRet1;
430}
UINT WINAPI waveOutUnprepareHeader(HWAVEOUT hWaveOut, LPWAVEHDR lpWaveOutHdr, UINT uSize)
Definition: winmm.c:2307

Referenced by WAVEMAP_wodMessage().

◆ wodWrite()

static DWORD wodWrite ( WAVEMAPDATA *  wom,
LPWAVEHDR  lpWaveHdrSrc,
DWORD  dwParam2 
)
static

Definition at line 313 of file wavemap.c.

314{
316 LPWAVEHDR lpWaveHdrDst;
317
318 TRACE("(%p %p %08lx)\n", wom, lpWaveHdrSrc, dwParam2);
319
320 if (!wom->hAcmStream) {
321 return waveOutWrite(wom->u.out.hInnerWave, lpWaveHdrSrc, dwParam2);
322 }
323
324 lpWaveHdrSrc->dwFlags |= WHDR_INQUEUE;
325 ash = (PACMSTREAMHEADER)lpWaveHdrSrc->reserved;
326 /* acmStreamConvert will actually check that the new size is less than initial size */
327 ash->cbSrcLength = lpWaveHdrSrc->dwBufferLength;
329 WARN("acmStreamConvert failed\n");
330 return MMSYSERR_ERROR;
331 }
332
333 lpWaveHdrDst = (LPWAVEHDR)((LPSTR)ash + sizeof(ACMSTREAMHEADER));
334 if (ash->cbSrcLength > ash->cbSrcLengthUsed)
335 FIXME("Not all src buffer has been written, expect bogus sound\n");
336 else if (ash->cbSrcLength < ash->cbSrcLengthUsed)
337 ERR("Codec has read more data than it is allowed to\n");
338
339 if (ash->cbDstLengthUsed == 0) {
340 /* something went wrong in decoding */
341 FIXME("Got 0 length\n");
342 return MMSYSERR_ERROR;
343 }
344 lpWaveHdrDst->dwBufferLength = ash->cbDstLengthUsed;
345 return waveOutWrite(wom->u.out.hInnerWave, lpWaveHdrDst, sizeof(*lpWaveHdrDst));
346}
UINT WINAPI waveOutWrite(HWAVEOUT hWaveOut, LPWAVEHDR lpWaveOutHdr, UINT uSize)
Definition: winmm.c:2341

Referenced by WAVEMAP_wodMessage().

Variable Documentation

◆ oss

struct WINE_WAVEMAP* oss = NULL
static

Definition at line 1186 of file wavemap.c.

Referenced by to_string(), WAVEMAP_drvClose(), and WAVEMAP_drvOpen().