annotate libao2/ao_win32.c @ 25661:293aeec83153

Replace the persistent CODECS_FLAG_SELECTED by a local "stringset" with an almost-trivial implementation. This allows making the builtin codec structs const, and it also makes clearer that this "selected" status is not used outside the init functions.
author reimar
date Sat, 12 Jan 2008 14:05:46 +0000
parents a124f3abc1ec
children 0f42fb42843c
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
7913
61060cbe44fb new windows waveout audio driver
faust3
parents:
diff changeset
1 /******************************************************************************
61060cbe44fb new windows waveout audio driver
faust3
parents:
diff changeset
2 * ao_win32.c: Windows waveOut interface for MPlayer
12151
75fdb659f5bf round len to outburst and increment full_buffers at the correct time, patch by Nehal <nehalmistry at gmx.net>
faust3
parents: 12146
diff changeset
3 * Copyright (c) 2002 - 2004 Sascha Sommer <saschasommer@freenet.de>.
7913
61060cbe44fb new windows waveout audio driver
faust3
parents:
diff changeset
4 *
61060cbe44fb new windows waveout audio driver
faust3
parents:
diff changeset
5 * This program is free software; you can redistribute it and/or modify
61060cbe44fb new windows waveout audio driver
faust3
parents:
diff changeset
6 * it under the terms of the GNU General Public License as published by
61060cbe44fb new windows waveout audio driver
faust3
parents:
diff changeset
7 * the Free Software Foundation; either version 2 of the License, or
61060cbe44fb new windows waveout audio driver
faust3
parents:
diff changeset
8 * (at your option) any later version.
61060cbe44fb new windows waveout audio driver
faust3
parents:
diff changeset
9 *
61060cbe44fb new windows waveout audio driver
faust3
parents:
diff changeset
10 * This program is distributed in the hope that it will be useful,
61060cbe44fb new windows waveout audio driver
faust3
parents:
diff changeset
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
61060cbe44fb new windows waveout audio driver
faust3
parents:
diff changeset
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
61060cbe44fb new windows waveout audio driver
faust3
parents:
diff changeset
13 * GNU General Public License for more details.
61060cbe44fb new windows waveout audio driver
faust3
parents:
diff changeset
14 *
61060cbe44fb new windows waveout audio driver
faust3
parents:
diff changeset
15 * You should have received a copy of the GNU General Public License
61060cbe44fb new windows waveout audio driver
faust3
parents:
diff changeset
16 * along with this program; if not, write to the Free Software
19614
36589811e5d0 The FSF changed postal address.
diego
parents: 18915
diff changeset
17 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
7913
61060cbe44fb new windows waveout audio driver
faust3
parents:
diff changeset
18 *
61060cbe44fb new windows waveout audio driver
faust3
parents:
diff changeset
19 *****************************************************************************/
61060cbe44fb new windows waveout audio driver
faust3
parents:
diff changeset
20
61060cbe44fb new windows waveout audio driver
faust3
parents:
diff changeset
21 #include <stdio.h>
61060cbe44fb new windows waveout audio driver
faust3
parents:
diff changeset
22 #include <stdlib.h>
61060cbe44fb new windows waveout audio driver
faust3
parents:
diff changeset
23 #include <windows.h>
61060cbe44fb new windows waveout audio driver
faust3
parents:
diff changeset
24 #include <mmsystem.h>
61060cbe44fb new windows waveout audio driver
faust3
parents:
diff changeset
25
14479
cae0dbeb44bb af_format.h needs config.h to be included first.
reimar
parents: 14264
diff changeset
26 #include "config.h"
14245
815f03b7cee5 removing AFMT_ dependancy
alex
parents: 14135
diff changeset
27 #include "libaf/af_format.h"
7913
61060cbe44fb new windows waveout audio driver
faust3
parents:
diff changeset
28 #include "audio_out.h"
61060cbe44fb new windows waveout audio driver
faust3
parents:
diff changeset
29 #include "audio_out_internal.h"
14123
a92101a7eb49 Make include paths consistent.
diego
parents: 13735
diff changeset
30 #include "mp_msg.h"
a92101a7eb49 Make include paths consistent.
diego
parents: 13735
diff changeset
31 #include "libvo/fastmemcpy.h"
12093
f54d02f6ddbf let uninit wait until sound is completely played, don't restore volume at exit, fixed ringbuffer bug, patch by Nehal <nehalmistry at gmx.net>\n
faust3
parents: 11511
diff changeset
32 #include "osdep/timer.h"
7913
61060cbe44fb new windows waveout audio driver
faust3
parents:
diff changeset
33
12699
02efc0619f61 10l WAVE_FORMAT_DOLBY_AC3_SPDIF needs to be defined first, patch by Gianluigi Tiesi <sherpya at netfarm.it>
faust3
parents: 12684
diff changeset
34 #define WAVE_FORMAT_DOLBY_AC3_SPDIF 0x0092
13017
5b9c594dc6e9 untested multichannel support
faust3
parents: 12795
diff changeset
35 #define WAVE_FORMAT_EXTENSIBLE 0xFFFE
5b9c594dc6e9 untested multichannel support
faust3
parents: 12795
diff changeset
36
5b9c594dc6e9 untested multichannel support
faust3
parents: 12795
diff changeset
37 static const GUID KSDATAFORMAT_SUBTYPE_PCM = {
5b9c594dc6e9 untested multichannel support
faust3
parents: 12795
diff changeset
38 0x1,0x0000,0x0010,{0x80,0x00,0x00,0xaa,0x00,0x38,0x9b,0x71}
5b9c594dc6e9 untested multichannel support
faust3
parents: 12795
diff changeset
39 };
5b9c594dc6e9 untested multichannel support
faust3
parents: 12795
diff changeset
40
5b9c594dc6e9 untested multichannel support
faust3
parents: 12795
diff changeset
41 typedef struct {
5b9c594dc6e9 untested multichannel support
faust3
parents: 12795
diff changeset
42 WAVEFORMATEX Format;
5b9c594dc6e9 untested multichannel support
faust3
parents: 12795
diff changeset
43 union {
5b9c594dc6e9 untested multichannel support
faust3
parents: 12795
diff changeset
44 WORD wValidBitsPerSample;
5b9c594dc6e9 untested multichannel support
faust3
parents: 12795
diff changeset
45 WORD wSamplesPerBlock;
5b9c594dc6e9 untested multichannel support
faust3
parents: 12795
diff changeset
46 WORD wReserved;
5b9c594dc6e9 untested multichannel support
faust3
parents: 12795
diff changeset
47 } Samples;
5b9c594dc6e9 untested multichannel support
faust3
parents: 12795
diff changeset
48 DWORD dwChannelMask;
5b9c594dc6e9 untested multichannel support
faust3
parents: 12795
diff changeset
49 GUID SubFormat;
5b9c594dc6e9 untested multichannel support
faust3
parents: 12795
diff changeset
50 } WAVEFORMATEXTENSIBLE, *PWAVEFORMATEXTENSIBLE;
5b9c594dc6e9 untested multichannel support
faust3
parents: 12795
diff changeset
51
5b9c594dc6e9 untested multichannel support
faust3
parents: 12795
diff changeset
52 #define SPEAKER_FRONT_LEFT 0x1
5b9c594dc6e9 untested multichannel support
faust3
parents: 12795
diff changeset
53 #define SPEAKER_FRONT_RIGHT 0x2
5b9c594dc6e9 untested multichannel support
faust3
parents: 12795
diff changeset
54 #define SPEAKER_FRONT_CENTER 0x4
5b9c594dc6e9 untested multichannel support
faust3
parents: 12795
diff changeset
55 #define SPEAKER_LOW_FREQUENCY 0x8
5b9c594dc6e9 untested multichannel support
faust3
parents: 12795
diff changeset
56 #define SPEAKER_BACK_LEFT 0x10
5b9c594dc6e9 untested multichannel support
faust3
parents: 12795
diff changeset
57 #define SPEAKER_BACK_RIGHT 0x20
5b9c594dc6e9 untested multichannel support
faust3
parents: 12795
diff changeset
58 #define SPEAKER_FRONT_LEFT_OF_CENTER 0x40
5b9c594dc6e9 untested multichannel support
faust3
parents: 12795
diff changeset
59 #define SPEAKER_FRONT_RIGHT_OF_CENTER 0x80
5b9c594dc6e9 untested multichannel support
faust3
parents: 12795
diff changeset
60 #define SPEAKER_BACK_CENTER 0x100
5b9c594dc6e9 untested multichannel support
faust3
parents: 12795
diff changeset
61 #define SPEAKER_SIDE_LEFT 0x200
5b9c594dc6e9 untested multichannel support
faust3
parents: 12795
diff changeset
62 #define SPEAKER_SIDE_RIGHT 0x400
5b9c594dc6e9 untested multichannel support
faust3
parents: 12795
diff changeset
63 #define SPEAKER_TOP_CENTER 0x800
5b9c594dc6e9 untested multichannel support
faust3
parents: 12795
diff changeset
64 #define SPEAKER_TOP_FRONT_LEFT 0x1000
5b9c594dc6e9 untested multichannel support
faust3
parents: 12795
diff changeset
65 #define SPEAKER_TOP_FRONT_CENTER 0x2000
5b9c594dc6e9 untested multichannel support
faust3
parents: 12795
diff changeset
66 #define SPEAKER_TOP_FRONT_RIGHT 0x4000
5b9c594dc6e9 untested multichannel support
faust3
parents: 12795
diff changeset
67 #define SPEAKER_TOP_BACK_LEFT 0x8000
5b9c594dc6e9 untested multichannel support
faust3
parents: 12795
diff changeset
68 #define SPEAKER_TOP_BACK_CENTER 0x10000
5b9c594dc6e9 untested multichannel support
faust3
parents: 12795
diff changeset
69 #define SPEAKER_TOP_BACK_RIGHT 0x20000
5b9c594dc6e9 untested multichannel support
faust3
parents: 12795
diff changeset
70
5b9c594dc6e9 untested multichannel support
faust3
parents: 12795
diff changeset
71 static const int channel_mask[] = {
5b9c594dc6e9 untested multichannel support
faust3
parents: 12795
diff changeset
72 SPEAKER_FRONT_LEFT | SPEAKER_FRONT_RIGHT | SPEAKER_LOW_FREQUENCY,
5b9c594dc6e9 untested multichannel support
faust3
parents: 12795
diff changeset
73 SPEAKER_FRONT_LEFT | SPEAKER_FRONT_CENTER | SPEAKER_FRONT_RIGHT | SPEAKER_LOW_FREQUENCY,
5b9c594dc6e9 untested multichannel support
faust3
parents: 12795
diff changeset
74 SPEAKER_FRONT_LEFT | SPEAKER_FRONT_CENTER | SPEAKER_FRONT_RIGHT | SPEAKER_BACK_CENTER | SPEAKER_LOW_FREQUENCY,
5b9c594dc6e9 untested multichannel support
faust3
parents: 12795
diff changeset
75 SPEAKER_FRONT_LEFT | SPEAKER_FRONT_CENTER | SPEAKER_FRONT_RIGHT | SPEAKER_BACK_LEFT | SPEAKER_BACK_RIGHT | SPEAKER_LOW_FREQUENCY
5b9c594dc6e9 untested multichannel support
faust3
parents: 12795
diff changeset
76 };
5b9c594dc6e9 untested multichannel support
faust3
parents: 12795
diff changeset
77
5b9c594dc6e9 untested multichannel support
faust3
parents: 12795
diff changeset
78
12699
02efc0619f61 10l WAVE_FORMAT_DOLBY_AC3_SPDIF needs to be defined first, patch by Gianluigi Tiesi <sherpya at netfarm.it>
faust3
parents: 12684
diff changeset
79
12155
deb95ac21f14 restore original ringbuffer constants as the current values are causing heavy stutter here, especially noticable after moving the video window
faust3
parents: 12151
diff changeset
80 #define SAMPLESIZE 1024
7913
61060cbe44fb new windows waveout audio driver
faust3
parents:
diff changeset
81 #define BUFFER_SIZE 4096
12155
deb95ac21f14 restore original ringbuffer constants as the current values are causing heavy stutter here, especially noticable after moving the video window
faust3
parents: 12151
diff changeset
82 #define BUFFER_COUNT 16
7913
61060cbe44fb new windows waveout audio driver
faust3
parents:
diff changeset
83
61060cbe44fb new windows waveout audio driver
faust3
parents:
diff changeset
84
61060cbe44fb new windows waveout audio driver
faust3
parents:
diff changeset
85 static WAVEHDR* waveBlocks; //pointer to our ringbuffer memory
61060cbe44fb new windows waveout audio driver
faust3
parents:
diff changeset
86 static HWAVEOUT hWaveOut; //handle to the waveout device
61060cbe44fb new windows waveout audio driver
faust3
parents:
diff changeset
87 static unsigned int buf_write=0;
61060cbe44fb new windows waveout audio driver
faust3
parents:
diff changeset
88 static unsigned int buf_write_pos=0;
61060cbe44fb new windows waveout audio driver
faust3
parents:
diff changeset
89 static int full_buffers=0;
61060cbe44fb new windows waveout audio driver
faust3
parents:
diff changeset
90 static int buffered_bytes=0;
61060cbe44fb new windows waveout audio driver
faust3
parents:
diff changeset
91
61060cbe44fb new windows waveout audio driver
faust3
parents:
diff changeset
92
61060cbe44fb new windows waveout audio driver
faust3
parents:
diff changeset
93 static ao_info_t info =
61060cbe44fb new windows waveout audio driver
faust3
parents:
diff changeset
94 {
61060cbe44fb new windows waveout audio driver
faust3
parents:
diff changeset
95 "Windows waveOut audio output",
61060cbe44fb new windows waveout audio driver
faust3
parents:
diff changeset
96 "win32",
61060cbe44fb new windows waveout audio driver
faust3
parents:
diff changeset
97 "Sascha Sommer <saschasommer@freenet.de>",
61060cbe44fb new windows waveout audio driver
faust3
parents:
diff changeset
98 ""
61060cbe44fb new windows waveout audio driver
faust3
parents:
diff changeset
99 };
61060cbe44fb new windows waveout audio driver
faust3
parents:
diff changeset
100
61060cbe44fb new windows waveout audio driver
faust3
parents:
diff changeset
101 LIBAO_EXTERN(win32)
61060cbe44fb new windows waveout audio driver
faust3
parents:
diff changeset
102
61060cbe44fb new windows waveout audio driver
faust3
parents:
diff changeset
103 static void CALLBACK waveOutProc(HWAVEOUT hWaveOut,UINT uMsg,DWORD dwInstance,
61060cbe44fb new windows waveout audio driver
faust3
parents:
diff changeset
104 DWORD dwParam1,DWORD dwParam2)
61060cbe44fb new windows waveout audio driver
faust3
parents:
diff changeset
105 {
61060cbe44fb new windows waveout audio driver
faust3
parents:
diff changeset
106 if(uMsg != WOM_DONE)
61060cbe44fb new windows waveout audio driver
faust3
parents:
diff changeset
107 return;
12093
f54d02f6ddbf let uninit wait until sound is completely played, don't restore volume at exit, fixed ringbuffer bug, patch by Nehal <nehalmistry at gmx.net>\n
faust3
parents: 11511
diff changeset
108 if (full_buffers) {
f54d02f6ddbf let uninit wait until sound is completely played, don't restore volume at exit, fixed ringbuffer bug, patch by Nehal <nehalmistry at gmx.net>\n
faust3
parents: 11511
diff changeset
109 buffered_bytes-=BUFFER_SIZE;
f54d02f6ddbf let uninit wait until sound is completely played, don't restore volume at exit, fixed ringbuffer bug, patch by Nehal <nehalmistry at gmx.net>\n
faust3
parents: 11511
diff changeset
110 --full_buffers;
f54d02f6ddbf let uninit wait until sound is completely played, don't restore volume at exit, fixed ringbuffer bug, patch by Nehal <nehalmistry at gmx.net>\n
faust3
parents: 11511
diff changeset
111 } else {
f54d02f6ddbf let uninit wait until sound is completely played, don't restore volume at exit, fixed ringbuffer bug, patch by Nehal <nehalmistry at gmx.net>\n
faust3
parents: 11511
diff changeset
112 buffered_bytes=0;
f54d02f6ddbf let uninit wait until sound is completely played, don't restore volume at exit, fixed ringbuffer bug, patch by Nehal <nehalmistry at gmx.net>\n
faust3
parents: 11511
diff changeset
113 }
7913
61060cbe44fb new windows waveout audio driver
faust3
parents:
diff changeset
114 }
61060cbe44fb new windows waveout audio driver
faust3
parents:
diff changeset
115
61060cbe44fb new windows waveout audio driver
faust3
parents:
diff changeset
116 // to set/get/query special features/parameters
9633
12b1790038b0 64bit libao2 fix by Jens Axboe <mplayer-dev@kernel.dk>
alex
parents: 9589
diff changeset
117 static int control(int cmd,void *arg)
7913
61060cbe44fb new windows waveout audio driver
faust3
parents:
diff changeset
118 {
61060cbe44fb new windows waveout audio driver
faust3
parents:
diff changeset
119 DWORD volume;
61060cbe44fb new windows waveout audio driver
faust3
parents:
diff changeset
120 switch (cmd)
61060cbe44fb new windows waveout audio driver
faust3
parents:
diff changeset
121 {
61060cbe44fb new windows waveout audio driver
faust3
parents:
diff changeset
122 case AOCONTROL_GET_VOLUME:
61060cbe44fb new windows waveout audio driver
faust3
parents:
diff changeset
123 {
61060cbe44fb new windows waveout audio driver
faust3
parents:
diff changeset
124 ao_control_vol_t* vol = (ao_control_vol_t*)arg;
61060cbe44fb new windows waveout audio driver
faust3
parents:
diff changeset
125 waveOutGetVolume(hWaveOut,&volume);
61060cbe44fb new windows waveout audio driver
faust3
parents:
diff changeset
126 vol->left = (float)(LOWORD(volume)/655.35);
61060cbe44fb new windows waveout audio driver
faust3
parents:
diff changeset
127 vol->right = (float)(HIWORD(volume)/655.35);
61060cbe44fb new windows waveout audio driver
faust3
parents:
diff changeset
128 mp_msg(MSGT_AO, MSGL_DBG2,"ao_win32: volume left:%f volume right:%f\n",vol->left,vol->right);
61060cbe44fb new windows waveout audio driver
faust3
parents:
diff changeset
129 return CONTROL_OK;
61060cbe44fb new windows waveout audio driver
faust3
parents:
diff changeset
130 }
61060cbe44fb new windows waveout audio driver
faust3
parents:
diff changeset
131 case AOCONTROL_SET_VOLUME:
61060cbe44fb new windows waveout audio driver
faust3
parents:
diff changeset
132 {
61060cbe44fb new windows waveout audio driver
faust3
parents:
diff changeset
133 ao_control_vol_t* vol = (ao_control_vol_t*)arg;
61060cbe44fb new windows waveout audio driver
faust3
parents:
diff changeset
134 volume = MAKELONG(vol->left*655.35,vol->right*655.35);
61060cbe44fb new windows waveout audio driver
faust3
parents:
diff changeset
135 waveOutSetVolume(hWaveOut,volume);
61060cbe44fb new windows waveout audio driver
faust3
parents:
diff changeset
136 return CONTROL_OK;
61060cbe44fb new windows waveout audio driver
faust3
parents:
diff changeset
137 }
61060cbe44fb new windows waveout audio driver
faust3
parents:
diff changeset
138 }
61060cbe44fb new windows waveout audio driver
faust3
parents:
diff changeset
139 return -1;
61060cbe44fb new windows waveout audio driver
faust3
parents:
diff changeset
140 }
61060cbe44fb new windows waveout audio driver
faust3
parents:
diff changeset
141
61060cbe44fb new windows waveout audio driver
faust3
parents:
diff changeset
142 // open & setup audio device
61060cbe44fb new windows waveout audio driver
faust3
parents:
diff changeset
143 // return: 1=success 0=fail
61060cbe44fb new windows waveout audio driver
faust3
parents:
diff changeset
144 static int init(int rate,int channels,int format,int flags)
61060cbe44fb new windows waveout audio driver
faust3
parents:
diff changeset
145 {
13017
5b9c594dc6e9 untested multichannel support
faust3
parents: 12795
diff changeset
146 WAVEFORMATEXTENSIBLE wformat;
7913
61060cbe44fb new windows waveout audio driver
faust3
parents:
diff changeset
147 DWORD totalBufferSize = (BUFFER_SIZE + sizeof(WAVEHDR)) * BUFFER_COUNT;
61060cbe44fb new windows waveout audio driver
faust3
parents:
diff changeset
148 MMRESULT result;
61060cbe44fb new windows waveout audio driver
faust3
parents:
diff changeset
149 unsigned char* buffer;
61060cbe44fb new windows waveout audio driver
faust3
parents:
diff changeset
150 int i;
61060cbe44fb new windows waveout audio driver
faust3
parents:
diff changeset
151
14135
234295985ccd disable all unknown formats in the windows aos
faust3
parents: 14123
diff changeset
152 switch(format){
14245
815f03b7cee5 removing AFMT_ dependancy
alex
parents: 14135
diff changeset
153 case AF_FORMAT_AC3:
815f03b7cee5 removing AFMT_ dependancy
alex
parents: 14135
diff changeset
154 case AF_FORMAT_S24_LE:
815f03b7cee5 removing AFMT_ dependancy
alex
parents: 14135
diff changeset
155 case AF_FORMAT_S16_LE:
815f03b7cee5 removing AFMT_ dependancy
alex
parents: 14135
diff changeset
156 case AF_FORMAT_S8:
14135
234295985ccd disable all unknown formats in the windows aos
faust3
parents: 14123
diff changeset
157 break;
234295985ccd disable all unknown formats in the windows aos
faust3
parents: 14123
diff changeset
158 default:
14264
cb5fbade8a5c af_fmt2str_short
alex
parents: 14249
diff changeset
159 mp_msg(MSGT_AO, MSGL_V,"ao_win32: format %s not supported defaulting to Signed 16-bit Little-Endian\n",af_fmt2str_short(format));
14245
815f03b7cee5 removing AFMT_ dependancy
alex
parents: 14135
diff changeset
160 format=AF_FORMAT_S16_LE;
14135
234295985ccd disable all unknown formats in the windows aos
faust3
parents: 14123
diff changeset
161 }
19835
807cdfafa0ce disable multichannel mode, it never worked reliable
faust3
parents: 19614
diff changeset
162
807cdfafa0ce disable multichannel mode, it never worked reliable
faust3
parents: 19614
diff changeset
163 // FIXME multichannel mode is buggy
807cdfafa0ce disable multichannel mode, it never worked reliable
faust3
parents: 19614
diff changeset
164 if(channels > 2)
807cdfafa0ce disable multichannel mode, it never worked reliable
faust3
parents: 19614
diff changeset
165 channels = 2;
807cdfafa0ce disable multichannel mode, it never worked reliable
faust3
parents: 19614
diff changeset
166
7913
61060cbe44fb new windows waveout audio driver
faust3
parents:
diff changeset
167 //fill global ao_data
61060cbe44fb new windows waveout audio driver
faust3
parents:
diff changeset
168 ao_data.channels=channels;
61060cbe44fb new windows waveout audio driver
faust3
parents:
diff changeset
169 ao_data.samplerate=rate;
61060cbe44fb new windows waveout audio driver
faust3
parents:
diff changeset
170 ao_data.format=format;
61060cbe44fb new windows waveout audio driver
faust3
parents:
diff changeset
171 ao_data.bps=channels*rate;
14245
815f03b7cee5 removing AFMT_ dependancy
alex
parents: 14135
diff changeset
172 if(format != AF_FORMAT_U8 && format != AF_FORMAT_S8)
7913
61060cbe44fb new windows waveout audio driver
faust3
parents:
diff changeset
173 ao_data.bps*=2;
61060cbe44fb new windows waveout audio driver
faust3
parents:
diff changeset
174 if(ao_data.buffersize==-1)
61060cbe44fb new windows waveout audio driver
faust3
parents:
diff changeset
175 {
14264
cb5fbade8a5c af_fmt2str_short
alex
parents: 14249
diff changeset
176 ao_data.buffersize=af_fmt2bits(format)/8;
7913
61060cbe44fb new windows waveout audio driver
faust3
parents:
diff changeset
177 ao_data.buffersize*= channels;
61060cbe44fb new windows waveout audio driver
faust3
parents:
diff changeset
178 ao_data.buffersize*= SAMPLESIZE;
61060cbe44fb new windows waveout audio driver
faust3
parents:
diff changeset
179 }
14264
cb5fbade8a5c af_fmt2str_short
alex
parents: 14249
diff changeset
180 mp_msg(MSGT_AO, MSGL_V,"ao_win32: Samplerate:%iHz Channels:%i Format:%s\n",rate, channels, af_fmt2str_short(format));
7913
61060cbe44fb new windows waveout audio driver
faust3
parents:
diff changeset
181 mp_msg(MSGT_AO, MSGL_V,"ao_win32: Buffersize:%d\n",ao_data.buffersize);
61060cbe44fb new windows waveout audio driver
faust3
parents:
diff changeset
182
61060cbe44fb new windows waveout audio driver
faust3
parents:
diff changeset
183 //fill waveformatex
13017
5b9c594dc6e9 untested multichannel support
faust3
parents: 12795
diff changeset
184 ZeroMemory( &wformat, sizeof(WAVEFORMATEXTENSIBLE));
13735
83c5f9888576 ringbuffer variable intialization fix for multifile playback patch by Rune Petersen <rune.mail-list at mail.tele.dk>
faust3
parents: 13017
diff changeset
185 wformat.Format.cbSize = (channels>2)?sizeof(WAVEFORMATEXTENSIBLE)-sizeof(WAVEFORMATEX):0;
13017
5b9c594dc6e9 untested multichannel support
faust3
parents: 12795
diff changeset
186 wformat.Format.nChannels = channels;
5b9c594dc6e9 untested multichannel support
faust3
parents: 12795
diff changeset
187 wformat.Format.nSamplesPerSec = rate;
14245
815f03b7cee5 removing AFMT_ dependancy
alex
parents: 14135
diff changeset
188 if(format == AF_FORMAT_AC3)
12684
47598beff93a ac3 passthrough, initial patch by Gianluigi Tiesi <sherpya at netfarm.it>
faust3
parents: 12155
diff changeset
189 {
13017
5b9c594dc6e9 untested multichannel support
faust3
parents: 12795
diff changeset
190 wformat.Format.wFormatTag = WAVE_FORMAT_DOLBY_AC3_SPDIF;
5b9c594dc6e9 untested multichannel support
faust3
parents: 12795
diff changeset
191 wformat.Format.wBitsPerSample = 16;
5b9c594dc6e9 untested multichannel support
faust3
parents: 12795
diff changeset
192 wformat.Format.nBlockAlign = 4;
12684
47598beff93a ac3 passthrough, initial patch by Gianluigi Tiesi <sherpya at netfarm.it>
faust3
parents: 12155
diff changeset
193 }
47598beff93a ac3 passthrough, initial patch by Gianluigi Tiesi <sherpya at netfarm.it>
faust3
parents: 12155
diff changeset
194 else
47598beff93a ac3 passthrough, initial patch by Gianluigi Tiesi <sherpya at netfarm.it>
faust3
parents: 12155
diff changeset
195 {
13017
5b9c594dc6e9 untested multichannel support
faust3
parents: 12795
diff changeset
196 wformat.Format.wFormatTag = (channels>2)?WAVE_FORMAT_EXTENSIBLE:WAVE_FORMAT_PCM;
14264
cb5fbade8a5c af_fmt2str_short
alex
parents: 14249
diff changeset
197 wformat.Format.wBitsPerSample = af_fmt2bits(format);
13017
5b9c594dc6e9 untested multichannel support
faust3
parents: 12795
diff changeset
198 wformat.Format.nBlockAlign = wformat.Format.nChannels * (wformat.Format.wBitsPerSample >> 3);
5b9c594dc6e9 untested multichannel support
faust3
parents: 12795
diff changeset
199 }
5b9c594dc6e9 untested multichannel support
faust3
parents: 12795
diff changeset
200 if(channels>2)
5b9c594dc6e9 untested multichannel support
faust3
parents: 12795
diff changeset
201 {
5b9c594dc6e9 untested multichannel support
faust3
parents: 12795
diff changeset
202 wformat.dwChannelMask = channel_mask[channels-3];
5b9c594dc6e9 untested multichannel support
faust3
parents: 12795
diff changeset
203 wformat.SubFormat = KSDATAFORMAT_SUBTYPE_PCM;
14264
cb5fbade8a5c af_fmt2str_short
alex
parents: 14249
diff changeset
204 wformat.Samples.wValidBitsPerSample=af_fmt2bits(format);
13017
5b9c594dc6e9 untested multichannel support
faust3
parents: 12795
diff changeset
205 }
5b9c594dc6e9 untested multichannel support
faust3
parents: 12795
diff changeset
206
5b9c594dc6e9 untested multichannel support
faust3
parents: 12795
diff changeset
207 wformat.Format.nAvgBytesPerSec = wformat.Format.nSamplesPerSec * wformat.Format.nBlockAlign;
7913
61060cbe44fb new windows waveout audio driver
faust3
parents:
diff changeset
208
61060cbe44fb new windows waveout audio driver
faust3
parents:
diff changeset
209 //open sound device
61060cbe44fb new windows waveout audio driver
faust3
parents:
diff changeset
210 //WAVE_MAPPER always points to the default wave device on the system
14529
cc9c088305d9 WAVE_FORMAT_DIRECT seems to cause problems with certain os/driver combinations and seems to be useless anyway
faust3
parents: 14503
diff changeset
211 result = waveOutOpen(&hWaveOut,WAVE_MAPPER,(WAVEFORMATEX*)&wformat,(DWORD_PTR)waveOutProc,0,CALLBACK_FUNCTION);
7913
61060cbe44fb new windows waveout audio driver
faust3
parents:
diff changeset
212 if(result == WAVERR_BADFORMAT)
61060cbe44fb new windows waveout audio driver
faust3
parents:
diff changeset
213 {
61060cbe44fb new windows waveout audio driver
faust3
parents:
diff changeset
214 mp_msg(MSGT_AO, MSGL_ERR,"ao_win32: format not supported switching to default\n");
13017
5b9c594dc6e9 untested multichannel support
faust3
parents: 12795
diff changeset
215 ao_data.channels = wformat.Format.nChannels = 2;
5b9c594dc6e9 untested multichannel support
faust3
parents: 12795
diff changeset
216 ao_data.samplerate = wformat.Format.nSamplesPerSec = 44100;
14245
815f03b7cee5 removing AFMT_ dependancy
alex
parents: 14135
diff changeset
217 ao_data.format = AF_FORMAT_S16_LE;
13017
5b9c594dc6e9 untested multichannel support
faust3
parents: 12795
diff changeset
218 ao_data.bps=ao_data.channels * ao_data.samplerate*2;
5b9c594dc6e9 untested multichannel support
faust3
parents: 12795
diff changeset
219 wformat.Format.wBitsPerSample=16;
5b9c594dc6e9 untested multichannel support
faust3
parents: 12795
diff changeset
220 wformat.Format.wFormatTag=WAVE_FORMAT_PCM;
5b9c594dc6e9 untested multichannel support
faust3
parents: 12795
diff changeset
221 wformat.Format.nBlockAlign = wformat.Format.nChannels * (wformat.Format.wBitsPerSample >> 3);
5b9c594dc6e9 untested multichannel support
faust3
parents: 12795
diff changeset
222 wformat.Format.nAvgBytesPerSec = wformat.Format.nSamplesPerSec * wformat.Format.nBlockAlign;
5b9c594dc6e9 untested multichannel support
faust3
parents: 12795
diff changeset
223 ao_data.buffersize=(wformat.Format.wBitsPerSample>>3)*wformat.Format.nChannels*SAMPLESIZE;
5b9c594dc6e9 untested multichannel support
faust3
parents: 12795
diff changeset
224 result = waveOutOpen(&hWaveOut,WAVE_MAPPER,(WAVEFORMATEX*)&wformat,(DWORD_PTR)waveOutProc,0,CALLBACK_FUNCTION);
7913
61060cbe44fb new windows waveout audio driver
faust3
parents:
diff changeset
225 }
61060cbe44fb new windows waveout audio driver
faust3
parents:
diff changeset
226 if(result != MMSYSERR_NOERROR)
61060cbe44fb new windows waveout audio driver
faust3
parents:
diff changeset
227 {
14503
af82f404a979 print why waveOutOpen failed
faust3
parents: 14479
diff changeset
228 mp_msg(MSGT_AO, MSGL_ERR,"ao_win32: unable to open wave mapper device (result=%i)\n",result);
7913
61060cbe44fb new windows waveout audio driver
faust3
parents:
diff changeset
229 return 0;
61060cbe44fb new windows waveout audio driver
faust3
parents:
diff changeset
230 }
61060cbe44fb new windows waveout audio driver
faust3
parents:
diff changeset
231 //allocate buffer memory as one big block
61060cbe44fb new windows waveout audio driver
faust3
parents:
diff changeset
232 buffer = malloc(totalBufferSize);
9589
1823fdaffa73 fix -loop problem
faust3
parents: 8657
diff changeset
233 memset(buffer,0x0,totalBufferSize);
7913
61060cbe44fb new windows waveout audio driver
faust3
parents:
diff changeset
234 //and setup pointers to each buffer
61060cbe44fb new windows waveout audio driver
faust3
parents:
diff changeset
235 waveBlocks = (WAVEHDR*)buffer;
61060cbe44fb new windows waveout audio driver
faust3
parents:
diff changeset
236 buffer += sizeof(WAVEHDR) * BUFFER_COUNT;
61060cbe44fb new windows waveout audio driver
faust3
parents:
diff changeset
237 for(i = 0; i < BUFFER_COUNT; i++) {
61060cbe44fb new windows waveout audio driver
faust3
parents:
diff changeset
238 waveBlocks[i].lpData = buffer;
61060cbe44fb new windows waveout audio driver
faust3
parents:
diff changeset
239 buffer += BUFFER_SIZE;
61060cbe44fb new windows waveout audio driver
faust3
parents:
diff changeset
240 }
13735
83c5f9888576 ringbuffer variable intialization fix for multifile playback patch by Rune Petersen <rune.mail-list at mail.tele.dk>
faust3
parents: 13017
diff changeset
241 buf_write=0;
83c5f9888576 ringbuffer variable intialization fix for multifile playback patch by Rune Petersen <rune.mail-list at mail.tele.dk>
faust3
parents: 13017
diff changeset
242 buf_write_pos=0;
83c5f9888576 ringbuffer variable intialization fix for multifile playback patch by Rune Petersen <rune.mail-list at mail.tele.dk>
faust3
parents: 13017
diff changeset
243 full_buffers=0;
83c5f9888576 ringbuffer variable intialization fix for multifile playback patch by Rune Petersen <rune.mail-list at mail.tele.dk>
faust3
parents: 13017
diff changeset
244 buffered_bytes=0;
7913
61060cbe44fb new windows waveout audio driver
faust3
parents:
diff changeset
245
61060cbe44fb new windows waveout audio driver
faust3
parents:
diff changeset
246 return 1;
61060cbe44fb new windows waveout audio driver
faust3
parents:
diff changeset
247 }
61060cbe44fb new windows waveout audio driver
faust3
parents:
diff changeset
248
61060cbe44fb new windows waveout audio driver
faust3
parents:
diff changeset
249 // close audio device
12145
99798c3cdb93 uninit immed flag
alex
parents: 12093
diff changeset
250 static void uninit(int immed)
7913
61060cbe44fb new windows waveout audio driver
faust3
parents:
diff changeset
251 {
12146
aaea699d0a67 support immed flag
faust3
parents: 12145
diff changeset
252 if(!immed)while(buffered_bytes > 0)usec_sleep(50000);
aaea699d0a67 support immed flag
faust3
parents: 12145
diff changeset
253 else buffered_bytes=0;
7913
61060cbe44fb new windows waveout audio driver
faust3
parents:
diff changeset
254 waveOutReset(hWaveOut);
61060cbe44fb new windows waveout audio driver
faust3
parents:
diff changeset
255 waveOutClose(hWaveOut);
61060cbe44fb new windows waveout audio driver
faust3
parents:
diff changeset
256 mp_msg(MSGT_AO, MSGL_V,"waveOut device closed\n");
61060cbe44fb new windows waveout audio driver
faust3
parents:
diff changeset
257 free(waveBlocks);
61060cbe44fb new windows waveout audio driver
faust3
parents:
diff changeset
258 mp_msg(MSGT_AO, MSGL_V,"buffer memory freed\n");
61060cbe44fb new windows waveout audio driver
faust3
parents:
diff changeset
259 }
61060cbe44fb new windows waveout audio driver
faust3
parents:
diff changeset
260
61060cbe44fb new windows waveout audio driver
faust3
parents:
diff changeset
261 // stop playing and empty buffers (for seeking/pause)
18915
99e20a22d5d0 modifies function declarations without parameters from ()
reynaldo
parents: 14529
diff changeset
262 static void reset(void)
7913
61060cbe44fb new windows waveout audio driver
faust3
parents:
diff changeset
263 {
61060cbe44fb new windows waveout audio driver
faust3
parents:
diff changeset
264 waveOutReset(hWaveOut);
61060cbe44fb new windows waveout audio driver
faust3
parents:
diff changeset
265 buf_write=0;
61060cbe44fb new windows waveout audio driver
faust3
parents:
diff changeset
266 buf_write_pos=0;
61060cbe44fb new windows waveout audio driver
faust3
parents:
diff changeset
267 full_buffers=0;
61060cbe44fb new windows waveout audio driver
faust3
parents:
diff changeset
268 buffered_bytes=0;
61060cbe44fb new windows waveout audio driver
faust3
parents:
diff changeset
269 }
61060cbe44fb new windows waveout audio driver
faust3
parents:
diff changeset
270
61060cbe44fb new windows waveout audio driver
faust3
parents:
diff changeset
271 // stop playing, keep buffers (for pause)
18915
99e20a22d5d0 modifies function declarations without parameters from ()
reynaldo
parents: 14529
diff changeset
272 static void audio_pause(void)
7913
61060cbe44fb new windows waveout audio driver
faust3
parents:
diff changeset
273 {
61060cbe44fb new windows waveout audio driver
faust3
parents:
diff changeset
274 waveOutPause(hWaveOut);
61060cbe44fb new windows waveout audio driver
faust3
parents:
diff changeset
275 }
61060cbe44fb new windows waveout audio driver
faust3
parents:
diff changeset
276
61060cbe44fb new windows waveout audio driver
faust3
parents:
diff changeset
277 // resume playing, after audio_pause()
18915
99e20a22d5d0 modifies function declarations without parameters from ()
reynaldo
parents: 14529
diff changeset
278 static void audio_resume(void)
7913
61060cbe44fb new windows waveout audio driver
faust3
parents:
diff changeset
279 {
61060cbe44fb new windows waveout audio driver
faust3
parents:
diff changeset
280 waveOutRestart(hWaveOut);
61060cbe44fb new windows waveout audio driver
faust3
parents:
diff changeset
281 }
61060cbe44fb new windows waveout audio driver
faust3
parents:
diff changeset
282
61060cbe44fb new windows waveout audio driver
faust3
parents:
diff changeset
283 // return: how many bytes can be played without blocking
18915
99e20a22d5d0 modifies function declarations without parameters from ()
reynaldo
parents: 14529
diff changeset
284 static int get_space(void)
7913
61060cbe44fb new windows waveout audio driver
faust3
parents:
diff changeset
285 {
12093
f54d02f6ddbf let uninit wait until sound is completely played, don't restore volume at exit, fixed ringbuffer bug, patch by Nehal <nehalmistry at gmx.net>\n
faust3
parents: 11511
diff changeset
286 return BUFFER_COUNT*BUFFER_SIZE - buffered_bytes;
7913
61060cbe44fb new windows waveout audio driver
faust3
parents:
diff changeset
287 }
61060cbe44fb new windows waveout audio driver
faust3
parents:
diff changeset
288
61060cbe44fb new windows waveout audio driver
faust3
parents:
diff changeset
289 //writes data into buffer, based on ringbuffer code in ao_sdl.c
61060cbe44fb new windows waveout audio driver
faust3
parents:
diff changeset
290 static int write_waveOutBuffer(unsigned char* data,int len){
61060cbe44fb new windows waveout audio driver
faust3
parents:
diff changeset
291 WAVEHDR* current;
61060cbe44fb new windows waveout audio driver
faust3
parents:
diff changeset
292 int len2=0;
61060cbe44fb new windows waveout audio driver
faust3
parents:
diff changeset
293 int x;
61060cbe44fb new windows waveout audio driver
faust3
parents:
diff changeset
294 while(len>0){
61060cbe44fb new windows waveout audio driver
faust3
parents:
diff changeset
295 current = &waveBlocks[buf_write];
12093
f54d02f6ddbf let uninit wait until sound is completely played, don't restore volume at exit, fixed ringbuffer bug, patch by Nehal <nehalmistry at gmx.net>\n
faust3
parents: 11511
diff changeset
296 if(buffered_bytes==BUFFER_COUNT*BUFFER_SIZE) break;
7913
61060cbe44fb new windows waveout audio driver
faust3
parents:
diff changeset
297 //unprepare the header if it is prepared
61060cbe44fb new windows waveout audio driver
faust3
parents:
diff changeset
298 if(current->dwFlags & WHDR_PREPARED)
61060cbe44fb new windows waveout audio driver
faust3
parents:
diff changeset
299 waveOutUnprepareHeader(hWaveOut, current, sizeof(WAVEHDR));
61060cbe44fb new windows waveout audio driver
faust3
parents:
diff changeset
300 x=BUFFER_SIZE-buf_write_pos;
61060cbe44fb new windows waveout audio driver
faust3
parents:
diff changeset
301 if(x>len) x=len;
23457
a124f3abc1ec Replace implicit use of fast_memcpy via macro by explicit use to allow
reimar
parents: 20250
diff changeset
302 fast_memcpy(current->lpData+buf_write_pos,data+len2,x);
12151
75fdb659f5bf round len to outburst and increment full_buffers at the correct time, patch by Nehal <nehalmistry at gmx.net>
faust3
parents: 12146
diff changeset
303 if(buf_write_pos==0)full_buffers++;
7913
61060cbe44fb new windows waveout audio driver
faust3
parents:
diff changeset
304 len2+=x; len-=x;
61060cbe44fb new windows waveout audio driver
faust3
parents:
diff changeset
305 buffered_bytes+=x; buf_write_pos+=x;
61060cbe44fb new windows waveout audio driver
faust3
parents:
diff changeset
306 //prepare header and write data to device
12093
f54d02f6ddbf let uninit wait until sound is completely played, don't restore volume at exit, fixed ringbuffer bug, patch by Nehal <nehalmistry at gmx.net>\n
faust3
parents: 11511
diff changeset
307 current->dwBufferLength = buf_write_pos;
7913
61060cbe44fb new windows waveout audio driver
faust3
parents:
diff changeset
308 waveOutPrepareHeader(hWaveOut, current, sizeof(WAVEHDR));
61060cbe44fb new windows waveout audio driver
faust3
parents:
diff changeset
309 waveOutWrite(hWaveOut, current, sizeof(WAVEHDR));
61060cbe44fb new windows waveout audio driver
faust3
parents:
diff changeset
310
61060cbe44fb new windows waveout audio driver
faust3
parents:
diff changeset
311 if(buf_write_pos>=BUFFER_SIZE){ //buffer is full find next
61060cbe44fb new windows waveout audio driver
faust3
parents:
diff changeset
312 // block is full, find next!
61060cbe44fb new windows waveout audio driver
faust3
parents:
diff changeset
313 buf_write=(buf_write+1)%BUFFER_COUNT;
61060cbe44fb new windows waveout audio driver
faust3
parents:
diff changeset
314 buf_write_pos=0;
61060cbe44fb new windows waveout audio driver
faust3
parents:
diff changeset
315 }
61060cbe44fb new windows waveout audio driver
faust3
parents:
diff changeset
316 }
61060cbe44fb new windows waveout audio driver
faust3
parents:
diff changeset
317 return len2;
61060cbe44fb new windows waveout audio driver
faust3
parents:
diff changeset
318 }
61060cbe44fb new windows waveout audio driver
faust3
parents:
diff changeset
319
61060cbe44fb new windows waveout audio driver
faust3
parents:
diff changeset
320 // plays 'len' bytes of 'data'
61060cbe44fb new windows waveout audio driver
faust3
parents:
diff changeset
321 // it should round it down to outburst*n
61060cbe44fb new windows waveout audio driver
faust3
parents:
diff changeset
322 // return: number of bytes played
61060cbe44fb new windows waveout audio driver
faust3
parents:
diff changeset
323 static int play(void* data,int len,int flags)
61060cbe44fb new windows waveout audio driver
faust3
parents:
diff changeset
324 {
20250
7cfd3a04d537 Implement AOPLAY_FINAL_CHUNK support for dshow and win32 out.
reimar
parents: 19835
diff changeset
325 if (!(flags & AOPLAY_FINAL_CHUNK))
12151
75fdb659f5bf round len to outburst and increment full_buffers at the correct time, patch by Nehal <nehalmistry at gmx.net>
faust3
parents: 12146
diff changeset
326 len = (len/ao_data.outburst)*ao_data.outburst;
7913
61060cbe44fb new windows waveout audio driver
faust3
parents:
diff changeset
327 return write_waveOutBuffer(data,len);
61060cbe44fb new windows waveout audio driver
faust3
parents:
diff changeset
328 }
10106
b5b7b2f4f069 10l remove unused global
faust3
parents: 9633
diff changeset
329
7913
61060cbe44fb new windows waveout audio driver
faust3
parents:
diff changeset
330 // return: delay in seconds between first and last sample in buffer
18915
99e20a22d5d0 modifies function declarations without parameters from ()
reynaldo
parents: 14529
diff changeset
331 static float get_delay(void)
7913
61060cbe44fb new windows waveout audio driver
faust3
parents:
diff changeset
332 {
61060cbe44fb new windows waveout audio driver
faust3
parents:
diff changeset
333 return (float)(buffered_bytes + ao_data.buffersize)/(float)ao_data.bps;
61060cbe44fb new windows waveout audio driver
faust3
parents:
diff changeset
334 }