Added YUV routines needed for v4l driver, and in the future possibly
[wine/gsoc-2012-control.git] / dlls / winmm / wineoss / audio.h
blob817a428da74d592e6654734b3c0c2596a1952ed8
1 /*
2 * Sample Wine Driver for Open Sound System (featured in Linux and FreeBSD)
4 * Copyright 1994 Martin Ayotte
5 * 1999 Eric Pouech (async playing in waveOut/waveIn)
6 * 2000 Eric Pouech (loops in waveOut)
7 * 2002 Eric Pouech (full duplex)
9 * This library is free software; you can redistribute it and/or
10 * modify it under the terms of the GNU Lesser General Public
11 * License as published by the Free Software Foundation; either
12 * version 2.1 of the License, or (at your option) any later version.
14 * This library is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
17 * Lesser General Public License for more details.
19 * You should have received a copy of the GNU Lesser General Public
20 * License along with this library; if not, write to the Free Software
21 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
24 #ifdef HAVE_OSS
26 /* unless someone makes a wineserver kernel module, Unix pipes are faster than win32 events */
27 #define USE_PIPE_SYNC
29 #define MAX_WAVEDRV (6)
31 /* states of the playing device */
32 #define WINE_WS_PLAYING 0
33 #define WINE_WS_PAUSED 1
34 #define WINE_WS_STOPPED 2
35 #define WINE_WS_CLOSED 3
37 /* events to be send to device */
38 enum win_wm_message {
39 WINE_WM_PAUSING = WM_USER + 1, WINE_WM_RESTARTING, WINE_WM_RESETTING, WINE_WM_HEADER,
40 WINE_WM_UPDATE, WINE_WM_BREAKLOOP, WINE_WM_CLOSING, WINE_WM_STARTING, WINE_WM_STOPPING
43 #ifdef USE_PIPE_SYNC
44 #define SIGNAL_OMR(omr) do { int x = 0; write((omr)->msg_pipe[1], &x, sizeof(x)); } while (0)
45 #define CLEAR_OMR(omr) do { int x = 0; read((omr)->msg_pipe[0], &x, sizeof(x)); } while (0)
46 #define RESET_OMR(omr) do { } while (0)
47 #define WAIT_OMR(omr, sleep) \
48 do { struct pollfd pfd; pfd.fd = (omr)->msg_pipe[0]; \
49 pfd.events = POLLIN; poll(&pfd, 1, sleep); } while (0)
50 #else
51 #define SIGNAL_OMR(omr) do { SetEvent((omr)->msg_event); } while (0)
52 #define CLEAR_OMR(omr) do { } while (0)
53 #define RESET_OMR(omr) do { ResetEvent((omr)->msg_event); } while (0)
54 #define WAIT_OMR(omr, sleep) \
55 do { WaitForSingleObject((omr)->msg_event, sleep); } while (0)
56 #endif
58 typedef struct {
59 enum win_wm_message msg; /* message identifier */
60 DWORD param; /* parameter for this message */
61 HANDLE hEvent; /* if message is synchronous, handle of event for synchro */
62 } OSS_MSG;
64 /* implement an in-process message ring for better performance
65 * (compared to passing thru the server)
66 * this ring will be used by the input (resp output) record (resp playback) routine
68 #define OSS_RING_BUFFER_INCREMENT 64
69 typedef struct {
70 int ring_buffer_size;
71 OSS_MSG * messages;
72 int msg_tosave;
73 int msg_toget;
74 #ifdef USE_PIPE_SYNC
75 int msg_pipe[2];
76 #else
77 HANDLE msg_event;
78 #endif
79 CRITICAL_SECTION msg_crst;
80 } OSS_MSG_RING;
82 typedef struct tagOSS_DEVICE {
83 char* dev_name;
84 char* mixer_name;
85 char* interface_name;
86 unsigned open_count;
87 WAVEOUTCAPSW out_caps;
88 WAVEOUTCAPSW duplex_out_caps;
89 WAVEINCAPSW in_caps;
90 DWORD in_caps_support;
91 unsigned open_access;
92 int fd;
93 DWORD owner_tid;
94 int sample_rate;
95 int stereo;
96 int format;
97 unsigned audio_fragment;
98 BOOL full_duplex;
99 BOOL bTriggerSupport;
100 BOOL bOutputEnabled;
101 BOOL bInputEnabled;
102 DSDRIVERDESC ds_desc;
103 DSDRIVERCAPS ds_caps;
104 DSCDRIVERCAPS dsc_caps;
105 } OSS_DEVICE;
107 typedef struct {
108 OSS_DEVICE* ossdev;
109 volatile int state; /* one of the WINE_WS_ manifest constants */
110 WAVEOPENDESC waveDesc;
111 WORD wFlags;
112 WAVEFORMATPCMEX waveFormat;
113 DWORD volume;
115 /* OSS information */
116 DWORD dwFragmentSize; /* size of OSS buffer fragment */
117 DWORD dwBufferSize; /* size of whole OSS buffer in bytes */
118 LPWAVEHDR lpQueuePtr; /* start of queued WAVEHDRs (waiting to be notified) */
119 LPWAVEHDR lpPlayPtr; /* start of not yet fully played buffers */
120 DWORD dwPartialOffset; /* Offset of not yet written bytes in lpPlayPtr */
122 LPWAVEHDR lpLoopPtr; /* pointer of first buffer in loop, if any */
123 DWORD dwLoops; /* private copy of loop counter */
125 DWORD dwPlayedTotal; /* number of bytes actually played since opening */
126 DWORD dwWrittenTotal; /* number of bytes written to OSS buffer since opening */
127 BOOL bNeedPost; /* whether audio still needs to be physically started */
129 /* synchronization stuff */
130 HANDLE hStartUpEvent;
131 HANDLE hThread;
132 DWORD dwThreadID;
133 OSS_MSG_RING msgRing;
135 /* make accomodation for the inacuraccy of OSS when reporting buffer size remaining by using the clock instead of GETOSPACE */
136 DWORD dwProjectedFinishTime;
138 } WINE_WAVEOUT;
140 typedef struct {
141 OSS_DEVICE* ossdev;
142 volatile int state;
143 DWORD dwFragmentSize; /* OpenSound '/dev/dsp' give us that size */
144 WAVEOPENDESC waveDesc;
145 WORD wFlags;
146 WAVEFORMATPCMEX waveFormat;
147 LPWAVEHDR lpQueuePtr;
148 DWORD dwTotalRecorded;
149 DWORD dwTotalRead;
151 /* synchronization stuff */
152 HANDLE hThread;
153 DWORD dwThreadID;
154 HANDLE hStartUpEvent;
155 OSS_MSG_RING msgRing;
156 } WINE_WAVEIN;
158 extern OSS_DEVICE OSS_Devices[MAX_WAVEDRV];
159 extern WINE_WAVEOUT WOutDev[MAX_WAVEDRV];
160 extern WINE_WAVEIN WInDev[MAX_WAVEDRV];
161 extern unsigned numOutDev;
162 extern unsigned numInDev;
164 extern int getEnables(OSS_DEVICE *ossdev);
165 extern void copy_format(LPWAVEFORMATEX wf1, LPWAVEFORMATPCMEX wf2);
167 extern DWORD OSS_OpenDevice(OSS_DEVICE* ossdev, unsigned req_access,
168 int* frag, int strict_format,
169 int sample_rate, int stereo, int fmt);
171 extern void OSS_CloseDevice(OSS_DEVICE* ossdev);
173 extern DWORD wodOpen(WORD wDevID, LPWAVEOPENDESC lpDesc, DWORD dwFlags);
174 extern DWORD wodSetVolume(WORD wDevID, DWORD dwParam);
175 extern DWORD widOpen(WORD wDevID, LPWAVEOPENDESC lpDesc, DWORD dwFlags);
177 /* dscapture.c */
178 extern DWORD widDsCreate(UINT wDevID, PIDSCDRIVER* drv);
179 extern DWORD widDsDesc(UINT wDevID, PDSDRIVERDESC desc);
181 /* dsrender.c */
182 extern DWORD wodDsCreate(UINT wDevID, PIDSDRIVER* drv);
183 extern DWORD wodDsDesc(UINT wDevID, PDSDRIVERDESC desc);
185 #endif /* HAVE_OSS */