Mercurial > mplayer.hg
annotate libao2/ao_dsound.c @ 29571:94524110f645
Make the loop detection for mov reference files less aggressive, fixes
playback of http://stream.qtv.apple.com/qtv/wgbh/http/nova_eu/nova_eu_3012c01_mp4_ref.mov
author | reimar |
---|---|
date | Tue, 01 Sep 2009 15:52:13 +0000 |
parents | 0f1b5b68af32 |
children | 2eff450157cd |
rev | line source |
---|---|
26743
0f42fb42843c
Use standard license headers with standard formatting.
diego
parents:
23458
diff
changeset
|
1 /* |
0f42fb42843c
Use standard license headers with standard formatting.
diego
parents:
23458
diff
changeset
|
2 * Windows DirectSound interface |
0f42fb42843c
Use standard license headers with standard formatting.
diego
parents:
23458
diff
changeset
|
3 * |
13460
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
4 * Copyright (c) 2004 Gabor Szecsi <deje@miki.hu> |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
5 * |
26743
0f42fb42843c
Use standard license headers with standard formatting.
diego
parents:
23458
diff
changeset
|
6 * This file is part of MPlayer. |
0f42fb42843c
Use standard license headers with standard formatting.
diego
parents:
23458
diff
changeset
|
7 * |
0f42fb42843c
Use standard license headers with standard formatting.
diego
parents:
23458
diff
changeset
|
8 * MPlayer is free software; you can redistribute it and/or modify |
13460
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
9 * it under the terms of the GNU General Public License as published by |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
10 * the Free Software Foundation; either version 2 of the License, or |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
11 * (at your option) any later version. |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
12 * |
26743
0f42fb42843c
Use standard license headers with standard formatting.
diego
parents:
23458
diff
changeset
|
13 * MPlayer is distributed in the hope that it will be useful, |
13460
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
16 * GNU General Public License for more details. |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
17 * |
26743
0f42fb42843c
Use standard license headers with standard formatting.
diego
parents:
23458
diff
changeset
|
18 * You should have received a copy of the GNU General Public License along |
0f42fb42843c
Use standard license headers with standard formatting.
diego
parents:
23458
diff
changeset
|
19 * with MPlayer; if not, write to the Free Software Foundation, Inc., |
0f42fb42843c
Use standard license headers with standard formatting.
diego
parents:
23458
diff
changeset
|
20 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. |
0f42fb42843c
Use standard license headers with standard formatting.
diego
parents:
23458
diff
changeset
|
21 */ |
0f42fb42843c
Use standard license headers with standard formatting.
diego
parents:
23458
diff
changeset
|
22 |
13460
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
23 /** |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
24 \todo verify/extend multichannel support |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
25 */ |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
26 |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
27 |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
28 #include <stdio.h> |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
29 #include <stdlib.h> |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
30 #include <windows.h> |
13640
a7d080bc610f
ao dsound improvements patch by Florian Dietrich <flodt8 at yahoo.de>
faust3
parents:
13460
diff
changeset
|
31 #define DIRECTSOUND_VERSION 0x0600 |
13460
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
32 #include <dsound.h> |
16972
6a1eaca0e6c1
DirectSound's GetVolume and SetVolume use 100ths of decibels and range from -10,000 to 0.
joey
parents:
14947
diff
changeset
|
33 #include <math.h> |
13460
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
34 |
14479 | 35 #include "config.h" |
14245 | 36 #include "libaf/af_format.h" |
13460
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
37 #include "audio_out.h" |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
38 #include "audio_out_internal.h" |
14123 | 39 #include "mp_msg.h" |
40 #include "libvo/fastmemcpy.h" | |
13460
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
41 #include "osdep/timer.h" |
14398 | 42 #include "subopt-helper.h" |
13460
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
43 |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
44 |
28823 | 45 static const ao_info_t info = |
13460
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
46 { |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
47 "Windows DirectSound audio output", |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
48 "dsound", |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
49 "Gabor Szecsi <deje@miki.hu>", |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
50 "" |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
51 }; |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
52 |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
53 LIBAO_EXTERN(dsound) |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
54 |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
55 /** |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
56 \todo use the definitions from the win32 api headers when they define these |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
57 */ |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
58 #if 1 |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
59 #define WAVE_FORMAT_IEEE_FLOAT 0x0003 |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
60 #define WAVE_FORMAT_DOLBY_AC3_SPDIF 0x0092 |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
61 #define WAVE_FORMAT_EXTENSIBLE 0xFFFE |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
62 |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
63 static const GUID KSDATAFORMAT_SUBTYPE_PCM = {0x1,0x0000,0x0010, {0x80,0x00,0x00,0xaa,0x00,0x38,0x9b,0x71}}; |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
64 |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
65 #define SPEAKER_FRONT_LEFT 0x1 |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
66 #define SPEAKER_FRONT_RIGHT 0x2 |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
67 #define SPEAKER_FRONT_CENTER 0x4 |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
68 #define SPEAKER_LOW_FREQUENCY 0x8 |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
69 #define SPEAKER_BACK_LEFT 0x10 |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
70 #define SPEAKER_BACK_RIGHT 0x20 |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
71 #define SPEAKER_FRONT_LEFT_OF_CENTER 0x40 |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
72 #define SPEAKER_FRONT_RIGHT_OF_CENTER 0x80 |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
73 #define SPEAKER_BACK_CENTER 0x100 |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
74 #define SPEAKER_SIDE_LEFT 0x200 |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
75 #define SPEAKER_SIDE_RIGHT 0x400 |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
76 #define SPEAKER_TOP_CENTER 0x800 |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
77 #define SPEAKER_TOP_FRONT_LEFT 0x1000 |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
78 #define SPEAKER_TOP_FRONT_CENTER 0x2000 |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
79 #define SPEAKER_TOP_FRONT_RIGHT 0x4000 |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
80 #define SPEAKER_TOP_BACK_LEFT 0x8000 |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
81 #define SPEAKER_TOP_BACK_CENTER 0x10000 |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
82 #define SPEAKER_TOP_BACK_RIGHT 0x20000 |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
83 #define SPEAKER_RESERVED 0x80000000 |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
84 |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
85 #define DSSPEAKER_HEADPHONE 0x00000001 |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
86 #define DSSPEAKER_MONO 0x00000002 |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
87 #define DSSPEAKER_QUAD 0x00000003 |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
88 #define DSSPEAKER_STEREO 0x00000004 |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
89 #define DSSPEAKER_SURROUND 0x00000005 |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
90 #define DSSPEAKER_5POINT1 0x00000006 |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
91 |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
92 #ifndef _WAVEFORMATEXTENSIBLE_ |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
93 typedef struct { |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
94 WAVEFORMATEX Format; |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
95 union { |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
96 WORD wValidBitsPerSample; /* bits of precision */ |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
97 WORD wSamplesPerBlock; /* valid if wBitsPerSample==0 */ |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
98 WORD wReserved; /* If neither applies, set to zero. */ |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
99 } Samples; |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
100 DWORD dwChannelMask; /* which channels are */ |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
101 /* present in stream */ |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
102 GUID SubFormat; |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
103 } WAVEFORMATEXTENSIBLE, *PWAVEFORMATEXTENSIBLE; |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
104 #endif |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
105 |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
106 #endif |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
107 |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
108 static const int channel_mask[] = { |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
109 SPEAKER_FRONT_LEFT | SPEAKER_FRONT_RIGHT | SPEAKER_LOW_FREQUENCY, |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
110 SPEAKER_FRONT_LEFT | SPEAKER_FRONT_RIGHT | SPEAKER_BACK_LEFT | SPEAKER_BACK_RIGHT, |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
111 SPEAKER_FRONT_LEFT | SPEAKER_FRONT_RIGHT | SPEAKER_BACK_LEFT | SPEAKER_BACK_RIGHT | SPEAKER_LOW_FREQUENCY, |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
112 SPEAKER_FRONT_LEFT | SPEAKER_FRONT_CENTER | SPEAKER_FRONT_RIGHT | SPEAKER_BACK_LEFT | SPEAKER_BACK_RIGHT | SPEAKER_LOW_FREQUENCY |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
113 }; |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
114 |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
115 static HINSTANCE hdsound_dll = NULL; ///handle to the dll |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28823
diff
changeset
|
116 static LPDIRECTSOUND hds = NULL; ///direct sound object |
13640
a7d080bc610f
ao dsound improvements patch by Florian Dietrich <flodt8 at yahoo.de>
faust3
parents:
13460
diff
changeset
|
117 static LPDIRECTSOUNDBUFFER hdspribuf = NULL; ///primary direct sound buffer |
a7d080bc610f
ao dsound improvements patch by Florian Dietrich <flodt8 at yahoo.de>
faust3
parents:
13460
diff
changeset
|
118 static LPDIRECTSOUNDBUFFER hdsbuf = NULL; ///secondary direct sound buffer (stream buffer) |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28823
diff
changeset
|
119 static int buffer_size = 0; ///size in bytes of the direct sound buffer |
13460
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
120 static int write_offset = 0; ///offset of the write cursor in the direct sound buffer |
14555
6fb9eca97d41
support immed flag, always initialize write_offset, min_free_space doesn't seem to be required anymore after Florian Dietrichs patches
faust3
parents:
14479
diff
changeset
|
121 static int min_free_space = 0; ///if the free space is below this value get_space() will return 0 |
14947
2f4f347bd5e4
get_space fix by Florian Dietrich <flodt8 at yahoo.de>
faust3
parents:
14555
diff
changeset
|
122 ///there will always be at least this amout of free space to prevent |
2f4f347bd5e4
get_space fix by Florian Dietrich <flodt8 at yahoo.de>
faust3
parents:
14555
diff
changeset
|
123 ///get_space() from returning wrong values when buffer is 100% full. |
2f4f347bd5e4
get_space fix by Florian Dietrich <flodt8 at yahoo.de>
faust3
parents:
14555
diff
changeset
|
124 ///will be replaced with nBlockAlign in init() |
14398 | 125 static int device_num = 0; ///wanted device number |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28823
diff
changeset
|
126 static GUID device; ///guid of the device |
13460
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
127 |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
128 /***************************************************************************************/ |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
129 |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
130 /** |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
131 \brief output error message |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
132 \param err error code |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
133 \return string with the error message |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
134 */ |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
135 static char * dserr2str(int err) |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
136 { |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
137 switch (err) { |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
138 case DS_OK: return "DS_OK"; |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
139 case DS_NO_VIRTUALIZATION: return "DS_NO_VIRTUALIZATION"; |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
140 case DSERR_ALLOCATED: return "DS_NO_VIRTUALIZATION"; |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
141 case DSERR_CONTROLUNAVAIL: return "DSERR_CONTROLUNAVAIL"; |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
142 case DSERR_INVALIDPARAM: return "DSERR_INVALIDPARAM"; |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
143 case DSERR_INVALIDCALL: return "DSERR_INVALIDCALL"; |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
144 case DSERR_GENERIC: return "DSERR_GENERIC"; |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
145 case DSERR_PRIOLEVELNEEDED: return "DSERR_PRIOLEVELNEEDED"; |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
146 case DSERR_OUTOFMEMORY: return "DSERR_OUTOFMEMORY"; |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
147 case DSERR_BADFORMAT: return "DSERR_BADFORMAT"; |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
148 case DSERR_UNSUPPORTED: return "DSERR_UNSUPPORTED"; |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
149 case DSERR_NODRIVER: return "DSERR_NODRIVER"; |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
150 case DSERR_ALREADYINITIALIZED: return "DSERR_ALREADYINITIALIZED"; |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
151 case DSERR_NOAGGREGATION: return "DSERR_NOAGGREGATION"; |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
152 case DSERR_BUFFERLOST: return "DSERR_BUFFERLOST"; |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
153 case DSERR_OTHERAPPHASPRIO: return "DSERR_OTHERAPPHASPRIO"; |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
154 case DSERR_UNINITIALIZED: return "DSERR_UNINITIALIZED"; |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
155 case DSERR_NOINTERFACE: return "DSERR_NOINTERFACE"; |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
156 case DSERR_ACCESSDENIED: return "DSERR_ACCESSDENIED"; |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
157 default: return "unknown"; |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
158 } |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
159 } |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
160 |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
161 /** |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
162 \brief uninitialize direct sound |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
163 */ |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
164 static void UninitDirectSound(void) |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
165 { |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
166 // finally release the DirectSound object |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
167 if (hds) { |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
168 IDirectSound_Release(hds); |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
169 hds = NULL; |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
170 } |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
171 // free DSOUND.DLL |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
172 if (hdsound_dll) { |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
173 FreeLibrary(hdsound_dll); |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
174 hdsound_dll = NULL; |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
175 } |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
176 mp_msg(MSGT_AO, MSGL_V, "ao_dsound: DirectSound uninitialized\n"); |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
177 } |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
178 |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
179 /** |
14398 | 180 \brief print the commandline help |
181 */ | |
18915
99e20a22d5d0
modifies function declarations without parameters from ()
reynaldo
parents:
16972
diff
changeset
|
182 static void print_help(void) |
14398 | 183 { |
184 mp_msg(MSGT_AO, MSGL_FATAL, | |
185 "\n-ao dsound commandline help:\n" | |
186 "Example: mplayer -ao dsound:device=1\n" | |
187 " sets 1st device\n" | |
188 "\nOptions:\n" | |
189 " device=<device-number>\n" | |
190 " Sets device number, use -v to get a list\n"); | |
191 } | |
192 | |
193 | |
194 /** | |
195 \brief enumerate direct sound devices | |
196 \return TRUE to continue with the enumeration | |
197 */ | |
198 static BOOL CALLBACK DirectSoundEnum(LPGUID guid,LPCSTR desc,LPCSTR module,LPVOID context) | |
199 { | |
200 int* device_index=context; | |
201 mp_msg(MSGT_AO, MSGL_V,"%i %s ",*device_index,desc); | |
202 if(device_num==*device_index){ | |
203 mp_msg(MSGT_AO, MSGL_V,"<--"); | |
204 if(guid){ | |
23458
973e53dc7df5
Do not use fast_memcpy for small size copy, esp. when the size is constant
reimar
parents:
23457
diff
changeset
|
205 memcpy(&device,guid,sizeof(GUID)); |
14398 | 206 } |
207 } | |
208 mp_msg(MSGT_AO, MSGL_V,"\n"); | |
209 (*device_index)++; | |
210 return TRUE; | |
211 } | |
212 | |
213 | |
214 /** | |
13460
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
215 \brief initilize direct sound |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
216 \return 0 if error, 1 if ok |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
217 */ |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
218 static int InitDirectSound(void) |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
219 { |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
220 DSCAPS dscaps; |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
221 |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
222 // initialize directsound |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
223 HRESULT (WINAPI *OurDirectSoundCreate)(LPGUID, LPDIRECTSOUND *, LPUNKNOWN); |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28823
diff
changeset
|
224 HRESULT (WINAPI *OurDirectSoundEnumerate)(LPDSENUMCALLBACKA, LPVOID); |
14398 | 225 int device_index=0; |
226 opt_t subopts[] = { | |
227 {"device", OPT_ARG_INT, &device_num,NULL}, | |
228 {NULL} | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28823
diff
changeset
|
229 }; |
14398 | 230 if (subopt_parse(ao_subdevice, subopts) != 0) { |
231 print_help(); | |
232 return 0; | |
233 } | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28823
diff
changeset
|
234 |
13460
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
235 hdsound_dll = LoadLibrary("DSOUND.DLL"); |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
236 if (hdsound_dll == NULL) { |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
237 mp_msg(MSGT_AO, MSGL_ERR, "ao_dsound: cannot load DSOUND.DLL\n"); |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
238 return 0; |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
239 } |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
240 OurDirectSoundCreate = (void*)GetProcAddress(hdsound_dll, "DirectSoundCreate"); |
14398 | 241 OurDirectSoundEnumerate = (void*)GetProcAddress(hdsound_dll, "DirectSoundEnumerateA"); |
13460
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
242 |
14398 | 243 if (OurDirectSoundCreate == NULL || OurDirectSoundEnumerate == NULL) { |
13460
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
244 mp_msg(MSGT_AO, MSGL_ERR, "ao_dsound: GetProcAddress FAILED\n"); |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
245 FreeLibrary(hdsound_dll); |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
246 return 0; |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
247 } |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28823
diff
changeset
|
248 |
14398 | 249 // Enumerate all directsound devices |
250 mp_msg(MSGT_AO, MSGL_V,"ao_dsound: Output Devices:\n"); | |
251 OurDirectSoundEnumerate(DirectSoundEnum,&device_index); | |
13460
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
252 |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
253 // Create the direct sound object |
14398 | 254 if FAILED(OurDirectSoundCreate((device_num)?&device:NULL, &hds, NULL )) { |
13460
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
255 mp_msg(MSGT_AO, MSGL_ERR, "ao_dsound: cannot create a DirectSound device\n"); |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
256 FreeLibrary(hdsound_dll); |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
257 return 0; |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
258 } |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
259 |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
260 /* Set DirectSound Cooperative level, ie what control we want over Windows |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
261 * sound device. In our case, DSSCL_EXCLUSIVE means that we can modify the |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
262 * settings of the primary buffer, but also that only the sound of our |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
263 * application will be hearable when it will have the focus. |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
264 * !!! (this is not really working as intended yet because to set the |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
265 * cooperative level you need the window handle of your application, and |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
266 * I don't know of any easy way to get it. Especially since we might play |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
267 * sound without any video, and so what window handle should we use ??? |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
268 * The hack for now is to use the Desktop window handle - it seems to be |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
269 * working */ |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
270 if (IDirectSound_SetCooperativeLevel(hds, GetDesktopWindow(), DSSCL_EXCLUSIVE)) { |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
271 mp_msg(MSGT_AO, MSGL_ERR, "ao_dsound: cannot set direct sound cooperative level\n"); |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
272 IDirectSound_Release(hds); |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
273 FreeLibrary(hdsound_dll); |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
274 return 0; |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
275 } |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
276 mp_msg(MSGT_AO, MSGL_V, "ao_dsound: DirectSound initialized\n"); |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
277 |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
278 memset(&dscaps, 0, sizeof(DSCAPS)); |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
279 dscaps.dwSize = sizeof(DSCAPS); |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
280 if (DS_OK == IDirectSound_GetCaps(hds, &dscaps)) { |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
281 if (dscaps.dwFlags & DSCAPS_EMULDRIVER) mp_msg(MSGT_AO, MSGL_V, "ao_dsound: DirectSound is emulated, waveOut may give better performance\n"); |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
282 } else { |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
283 mp_msg(MSGT_AO, MSGL_V, "ao_dsound: cannot get device capabilities\n"); |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
284 } |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
285 |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
286 return 1; |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
287 } |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
288 |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
289 /** |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
290 \brief destroy the direct sound buffer |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
291 */ |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
292 static void DestroyBuffer(void) |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
293 { |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
294 if (hdsbuf) { |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
295 IDirectSoundBuffer_Release(hdsbuf); |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
296 hdsbuf = NULL; |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
297 } |
13640
a7d080bc610f
ao dsound improvements patch by Florian Dietrich <flodt8 at yahoo.de>
faust3
parents:
13460
diff
changeset
|
298 if (hdspribuf) { |
a7d080bc610f
ao dsound improvements patch by Florian Dietrich <flodt8 at yahoo.de>
faust3
parents:
13460
diff
changeset
|
299 IDirectSoundBuffer_Release(hdspribuf); |
a7d080bc610f
ao dsound improvements patch by Florian Dietrich <flodt8 at yahoo.de>
faust3
parents:
13460
diff
changeset
|
300 hdspribuf = NULL; |
a7d080bc610f
ao dsound improvements patch by Florian Dietrich <flodt8 at yahoo.de>
faust3
parents:
13460
diff
changeset
|
301 } |
13460
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
302 } |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
303 |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
304 /** |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
305 \brief fill sound buffer |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
306 \param data pointer to the sound data to copy |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
307 \param len length of the data to copy in bytes |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
308 \return number of copyed bytes |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
309 */ |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
310 static int write_buffer(unsigned char *data, int len) |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
311 { |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
312 HRESULT res; |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28823
diff
changeset
|
313 LPVOID lpvPtr1; |
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28823
diff
changeset
|
314 DWORD dwBytes1; |
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28823
diff
changeset
|
315 LPVOID lpvPtr2; |
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28823
diff
changeset
|
316 DWORD dwBytes2; |
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28823
diff
changeset
|
317 |
13460
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
318 // Lock the buffer |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28823
diff
changeset
|
319 res = IDirectSoundBuffer_Lock(hdsbuf,write_offset, len, &lpvPtr1, &dwBytes1, &lpvPtr2, &dwBytes2, 0); |
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28823
diff
changeset
|
320 // If the buffer was lost, restore and retry lock. |
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28823
diff
changeset
|
321 if (DSERR_BUFFERLOST == res) |
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28823
diff
changeset
|
322 { |
13460
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
323 IDirectSoundBuffer_Restore(hdsbuf); |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
324 res = IDirectSoundBuffer_Lock(hdsbuf,write_offset, len, &lpvPtr1, &dwBytes1, &lpvPtr2, &dwBytes2, 0); |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
325 } |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28823
diff
changeset
|
326 |
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28823
diff
changeset
|
327 |
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28823
diff
changeset
|
328 if (SUCCEEDED(res)) |
13460
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
329 { |
14245 | 330 if( (ao_data.channels == 6) && (ao_data.format!=AF_FORMAT_AC3) ) { |
13674
b7322244e53c
channel reorder patch by Florian Dietrich <flodt8 at yahoo.de>
faust3
parents:
13640
diff
changeset
|
331 // reorder channels while writing to pointers. |
b7322244e53c
channel reorder patch by Florian Dietrich <flodt8 at yahoo.de>
faust3
parents:
13640
diff
changeset
|
332 // it's this easy because buffer size and len are always |
b7322244e53c
channel reorder patch by Florian Dietrich <flodt8 at yahoo.de>
faust3
parents:
13640
diff
changeset
|
333 // aligned to multiples of channels*bytespersample |
b7322244e53c
channel reorder patch by Florian Dietrich <flodt8 at yahoo.de>
faust3
parents:
13640
diff
changeset
|
334 // there's probably some room for speed improvements here |
b7322244e53c
channel reorder patch by Florian Dietrich <flodt8 at yahoo.de>
faust3
parents:
13640
diff
changeset
|
335 const int chantable[6] = {0, 1, 4, 5, 2, 3}; // reorder "matrix" |
b7322244e53c
channel reorder patch by Florian Dietrich <flodt8 at yahoo.de>
faust3
parents:
13640
diff
changeset
|
336 int i, j; |
b7322244e53c
channel reorder patch by Florian Dietrich <flodt8 at yahoo.de>
faust3
parents:
13640
diff
changeset
|
337 int numsamp,sampsize; |
b7322244e53c
channel reorder patch by Florian Dietrich <flodt8 at yahoo.de>
faust3
parents:
13640
diff
changeset
|
338 |
14249 | 339 sampsize = af_fmt2bits(ao_data.format)>>3; // bytes per sample |
13674
b7322244e53c
channel reorder patch by Florian Dietrich <flodt8 at yahoo.de>
faust3
parents:
13640
diff
changeset
|
340 numsamp = dwBytes1 / (ao_data.channels * sampsize); // number of samples for each channel in this buffer |
b7322244e53c
channel reorder patch by Florian Dietrich <flodt8 at yahoo.de>
faust3
parents:
13640
diff
changeset
|
341 |
b7322244e53c
channel reorder patch by Florian Dietrich <flodt8 at yahoo.de>
faust3
parents:
13640
diff
changeset
|
342 for( i = 0; i < numsamp; i++ ) for( j = 0; j < ao_data.channels; j++ ) { |
23458
973e53dc7df5
Do not use fast_memcpy for small size copy, esp. when the size is constant
reimar
parents:
23457
diff
changeset
|
343 memcpy(lpvPtr1+(i*ao_data.channels*sampsize)+(chantable[j]*sampsize),data+(i*ao_data.channels*sampsize)+(j*sampsize),sampsize); |
13674
b7322244e53c
channel reorder patch by Florian Dietrich <flodt8 at yahoo.de>
faust3
parents:
13640
diff
changeset
|
344 } |
b7322244e53c
channel reorder patch by Florian Dietrich <flodt8 at yahoo.de>
faust3
parents:
13640
diff
changeset
|
345 |
b7322244e53c
channel reorder patch by Florian Dietrich <flodt8 at yahoo.de>
faust3
parents:
13640
diff
changeset
|
346 if (NULL != lpvPtr2 ) |
b7322244e53c
channel reorder patch by Florian Dietrich <flodt8 at yahoo.de>
faust3
parents:
13640
diff
changeset
|
347 { |
b7322244e53c
channel reorder patch by Florian Dietrich <flodt8 at yahoo.de>
faust3
parents:
13640
diff
changeset
|
348 numsamp = dwBytes2 / (ao_data.channels * sampsize); |
b7322244e53c
channel reorder patch by Florian Dietrich <flodt8 at yahoo.de>
faust3
parents:
13640
diff
changeset
|
349 for( i = 0; i < numsamp; i++ ) for( j = 0; j < ao_data.channels; j++ ) { |
23458
973e53dc7df5
Do not use fast_memcpy for small size copy, esp. when the size is constant
reimar
parents:
23457
diff
changeset
|
350 memcpy(lpvPtr2+(i*ao_data.channels*sampsize)+(chantable[j]*sampsize),data+dwBytes1+(i*ao_data.channels*sampsize)+(j*sampsize),sampsize); |
13674
b7322244e53c
channel reorder patch by Florian Dietrich <flodt8 at yahoo.de>
faust3
parents:
13640
diff
changeset
|
351 } |
b7322244e53c
channel reorder patch by Florian Dietrich <flodt8 at yahoo.de>
faust3
parents:
13640
diff
changeset
|
352 } |
b7322244e53c
channel reorder patch by Florian Dietrich <flodt8 at yahoo.de>
faust3
parents:
13640
diff
changeset
|
353 |
b7322244e53c
channel reorder patch by Florian Dietrich <flodt8 at yahoo.de>
faust3
parents:
13640
diff
changeset
|
354 write_offset+=dwBytes1+dwBytes2; |
b7322244e53c
channel reorder patch by Florian Dietrich <flodt8 at yahoo.de>
faust3
parents:
13640
diff
changeset
|
355 if(write_offset>=buffer_size)write_offset=dwBytes2; |
b7322244e53c
channel reorder patch by Florian Dietrich <flodt8 at yahoo.de>
faust3
parents:
13640
diff
changeset
|
356 } else { |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28823
diff
changeset
|
357 // Write to pointers without reordering. |
23457
a124f3abc1ec
Replace implicit use of fast_memcpy via macro by explicit use to allow
reimar
parents:
20250
diff
changeset
|
358 fast_memcpy(lpvPtr1,data,dwBytes1); |
a124f3abc1ec
Replace implicit use of fast_memcpy via macro by explicit use to allow
reimar
parents:
20250
diff
changeset
|
359 if (NULL != lpvPtr2 )fast_memcpy(lpvPtr2,data+dwBytes1,dwBytes2); |
13460
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
360 write_offset+=dwBytes1+dwBytes2; |
13640
a7d080bc610f
ao dsound improvements patch by Florian Dietrich <flodt8 at yahoo.de>
faust3
parents:
13460
diff
changeset
|
361 if(write_offset>=buffer_size)write_offset=dwBytes2; |
13674
b7322244e53c
channel reorder patch by Florian Dietrich <flodt8 at yahoo.de>
faust3
parents:
13640
diff
changeset
|
362 } |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28823
diff
changeset
|
363 |
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28823
diff
changeset
|
364 // Release the data back to DirectSound. |
13460
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
365 res = IDirectSoundBuffer_Unlock(hdsbuf,lpvPtr1,dwBytes1,lpvPtr2,dwBytes2); |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28823
diff
changeset
|
366 if (SUCCEEDED(res)) |
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28823
diff
changeset
|
367 { |
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28823
diff
changeset
|
368 // Success. |
13460
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
369 DWORD status; |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
370 IDirectSoundBuffer_GetStatus(hdsbuf, &status); |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
371 if (!(status & DSBSTATUS_PLAYING)){ |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
372 res = IDirectSoundBuffer_Play(hdsbuf, 0, 0, DSBPLAY_LOOPING); |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
373 } |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28823
diff
changeset
|
374 return dwBytes1+dwBytes2; |
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28823
diff
changeset
|
375 } |
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28823
diff
changeset
|
376 } |
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28823
diff
changeset
|
377 // Lock, Unlock, or Restore failed. |
13460
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
378 return 0; |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
379 } |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
380 |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
381 /***************************************************************************************/ |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
382 |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
383 /** |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
384 \brief handle control commands |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
385 \param cmd command |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
386 \param arg argument |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
387 \return CONTROL_OK or -1 in case the command can't be handled |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
388 */ |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
389 static int control(int cmd, void *arg) |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
390 { |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
391 DWORD volume; |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
392 switch (cmd) { |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
393 case AOCONTROL_GET_VOLUME: { |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
394 ao_control_vol_t* vol = (ao_control_vol_t*)arg; |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
395 IDirectSoundBuffer_GetVolume(hdsbuf, &volume); |
16972
6a1eaca0e6c1
DirectSound's GetVolume and SetVolume use 100ths of decibels and range from -10,000 to 0.
joey
parents:
14947
diff
changeset
|
396 vol->left = vol->right = pow(10.0, (float)(volume+10000) / 5000.0); |
13460
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
397 //printf("ao_dsound: volume: %f\n",vol->left); |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
398 return CONTROL_OK; |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
399 } |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
400 case AOCONTROL_SET_VOLUME: { |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
401 ao_control_vol_t* vol = (ao_control_vol_t*)arg; |
16972
6a1eaca0e6c1
DirectSound's GetVolume and SetVolume use 100ths of decibels and range from -10,000 to 0.
joey
parents:
14947
diff
changeset
|
402 volume = (DWORD)(log10(vol->right) * 5000.0) - 10000; |
13460
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
403 IDirectSoundBuffer_SetVolume(hdsbuf, volume); |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
404 //printf("ao_dsound: volume: %f\n",vol->left); |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
405 return CONTROL_OK; |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
406 } |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
407 } |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
408 return -1; |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
409 } |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
410 |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28823
diff
changeset
|
411 /** |
13460
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
412 \brief setup sound device |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
413 \param rate samplerate |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
414 \param channels number of channels |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
415 \param format format |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
416 \param flags unused |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
417 \return 1=success 0=fail |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
418 */ |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
419 static int init(int rate, int channels, int format, int flags) |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
420 { |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
421 int res; |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
422 if (!InitDirectSound()) return 0; |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
423 |
13640
a7d080bc610f
ao dsound improvements patch by Florian Dietrich <flodt8 at yahoo.de>
faust3
parents:
13460
diff
changeset
|
424 // ok, now create the buffers |
13460
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
425 WAVEFORMATEXTENSIBLE wformat; |
13640
a7d080bc610f
ao dsound improvements patch by Florian Dietrich <flodt8 at yahoo.de>
faust3
parents:
13460
diff
changeset
|
426 DSBUFFERDESC dsbpridesc; |
13460
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
427 DSBUFFERDESC dsbdesc; |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
428 |
14135 | 429 //check if the format is supported in general |
430 switch(format){ | |
14245 | 431 case AF_FORMAT_AC3: |
432 case AF_FORMAT_S24_LE: | |
433 case AF_FORMAT_S16_LE: | |
28815
ce24a9f06ccb
The 8 bit per sample formats are unsigned on Windows, fixes playback with
reimar
parents:
26743
diff
changeset
|
434 case AF_FORMAT_U8: |
14135 | 435 break; |
436 default: | |
14264 | 437 mp_msg(MSGT_AO, MSGL_V,"ao_dsound: format %s not supported defaulting to Signed 16-bit Little-Endian\n",af_fmt2str_short(format)); |
14245 | 438 format=AF_FORMAT_S16_LE; |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28823
diff
changeset
|
439 } |
13460
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
440 //fill global ao_data |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
441 ao_data.channels = channels; |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
442 ao_data.samplerate = rate; |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
443 ao_data.format = format; |
14249 | 444 ao_data.bps = channels * rate * (af_fmt2bits(format)>>3); |
13640
a7d080bc610f
ao dsound improvements patch by Florian Dietrich <flodt8 at yahoo.de>
faust3
parents:
13460
diff
changeset
|
445 if(ao_data.buffersize==-1) ao_data.buffersize = ao_data.bps; // space for 1 sec |
14264 | 446 mp_msg(MSGT_AO, MSGL_V,"ao_dsound: Samplerate:%iHz Channels:%i Format:%s\n", rate, channels, af_fmt2str_short(format)); |
13640
a7d080bc610f
ao dsound improvements patch by Florian Dietrich <flodt8 at yahoo.de>
faust3
parents:
13460
diff
changeset
|
447 mp_msg(MSGT_AO, MSGL_V,"ao_dsound: Buffersize:%d bytes (%d msec)\n", ao_data.buffersize, ao_data.buffersize / ao_data.bps * 1000); |
13460
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
448 |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
449 //fill waveformatex |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
450 ZeroMemory(&wformat, sizeof(WAVEFORMATEXTENSIBLE)); |
13640
a7d080bc610f
ao dsound improvements patch by Florian Dietrich <flodt8 at yahoo.de>
faust3
parents:
13460
diff
changeset
|
451 wformat.Format.cbSize = (channels > 2) ? sizeof(WAVEFORMATEXTENSIBLE)-sizeof(WAVEFORMATEX) : 0; |
13460
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
452 wformat.Format.nChannels = channels; |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
453 wformat.Format.nSamplesPerSec = rate; |
14245 | 454 if (format == AF_FORMAT_AC3) { |
13460
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
455 wformat.Format.wFormatTag = WAVE_FORMAT_DOLBY_AC3_SPDIF; |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
456 wformat.Format.wBitsPerSample = 16; |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
457 wformat.Format.nBlockAlign = 4; |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
458 } else { |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
459 wformat.Format.wFormatTag = (channels > 2) ? WAVE_FORMAT_EXTENSIBLE : WAVE_FORMAT_PCM; |
14249 | 460 wformat.Format.wBitsPerSample = af_fmt2bits(format); |
13460
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
461 wformat.Format.nBlockAlign = wformat.Format.nChannels * (wformat.Format.wBitsPerSample >> 3); |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
462 } |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
463 |
13640
a7d080bc610f
ao dsound improvements patch by Florian Dietrich <flodt8 at yahoo.de>
faust3
parents:
13460
diff
changeset
|
464 // fill in primary sound buffer descriptor |
a7d080bc610f
ao dsound improvements patch by Florian Dietrich <flodt8 at yahoo.de>
faust3
parents:
13460
diff
changeset
|
465 memset(&dsbpridesc, 0, sizeof(DSBUFFERDESC)); |
a7d080bc610f
ao dsound improvements patch by Florian Dietrich <flodt8 at yahoo.de>
faust3
parents:
13460
diff
changeset
|
466 dsbpridesc.dwSize = sizeof(DSBUFFERDESC); |
a7d080bc610f
ao dsound improvements patch by Florian Dietrich <flodt8 at yahoo.de>
faust3
parents:
13460
diff
changeset
|
467 dsbpridesc.dwFlags = DSBCAPS_PRIMARYBUFFER; |
a7d080bc610f
ao dsound improvements patch by Florian Dietrich <flodt8 at yahoo.de>
faust3
parents:
13460
diff
changeset
|
468 dsbpridesc.dwBufferBytes = 0; |
a7d080bc610f
ao dsound improvements patch by Florian Dietrich <flodt8 at yahoo.de>
faust3
parents:
13460
diff
changeset
|
469 dsbpridesc.lpwfxFormat = NULL; |
a7d080bc610f
ao dsound improvements patch by Florian Dietrich <flodt8 at yahoo.de>
faust3
parents:
13460
diff
changeset
|
470 |
a7d080bc610f
ao dsound improvements patch by Florian Dietrich <flodt8 at yahoo.de>
faust3
parents:
13460
diff
changeset
|
471 |
a7d080bc610f
ao dsound improvements patch by Florian Dietrich <flodt8 at yahoo.de>
faust3
parents:
13460
diff
changeset
|
472 // fill in the secondary sound buffer (=stream buffer) descriptor |
13460
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
473 memset(&dsbdesc, 0, sizeof(DSBUFFERDESC)); |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
474 dsbdesc.dwSize = sizeof(DSBUFFERDESC); |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
475 dsbdesc.dwFlags = DSBCAPS_GETCURRENTPOSITION2 /** Better position accuracy */ |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
476 | DSBCAPS_GLOBALFOCUS /** Allows background playing */ |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
477 | DSBCAPS_CTRLVOLUME; /** volume control enabled */ |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
478 |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
479 if (channels > 2) { |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
480 wformat.dwChannelMask = channel_mask[channels - 3]; |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
481 wformat.SubFormat = KSDATAFORMAT_SUBTYPE_PCM; |
13640
a7d080bc610f
ao dsound improvements patch by Florian Dietrich <flodt8 at yahoo.de>
faust3
parents:
13460
diff
changeset
|
482 wformat.Samples.wValidBitsPerSample = wformat.Format.wBitsPerSample; |
13460
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
483 // Needed for 5.1 on emu101k - shit soundblaster |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
484 dsbdesc.dwFlags |= DSBCAPS_LOCHARDWARE; |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
485 } |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
486 wformat.Format.nAvgBytesPerSec = wformat.Format.nSamplesPerSec * wformat.Format.nBlockAlign; |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
487 |
13640
a7d080bc610f
ao dsound improvements patch by Florian Dietrich <flodt8 at yahoo.de>
faust3
parents:
13460
diff
changeset
|
488 dsbdesc.dwBufferBytes = ao_data.buffersize; |
13460
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
489 dsbdesc.lpwfxFormat = (WAVEFORMATEX *)&wformat; |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
490 buffer_size = dsbdesc.dwBufferBytes; |
14555
6fb9eca97d41
support immed flag, always initialize write_offset, min_free_space doesn't seem to be required anymore after Florian Dietrichs patches
faust3
parents:
14479
diff
changeset
|
491 write_offset = 0; |
14947
2f4f347bd5e4
get_space fix by Florian Dietrich <flodt8 at yahoo.de>
faust3
parents:
14555
diff
changeset
|
492 min_free_space = wformat.Format.nBlockAlign; |
13460
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
493 ao_data.outburst = wformat.Format.nBlockAlign * 512; |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
494 |
13640
a7d080bc610f
ao dsound improvements patch by Florian Dietrich <flodt8 at yahoo.de>
faust3
parents:
13460
diff
changeset
|
495 // create primary buffer and set its format |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28823
diff
changeset
|
496 |
13640
a7d080bc610f
ao dsound improvements patch by Florian Dietrich <flodt8 at yahoo.de>
faust3
parents:
13460
diff
changeset
|
497 res = IDirectSound_CreateSoundBuffer( hds, &dsbpridesc, &hdspribuf, NULL ); |
a7d080bc610f
ao dsound improvements patch by Florian Dietrich <flodt8 at yahoo.de>
faust3
parents:
13460
diff
changeset
|
498 if ( res != DS_OK ) { |
a7d080bc610f
ao dsound improvements patch by Florian Dietrich <flodt8 at yahoo.de>
faust3
parents:
13460
diff
changeset
|
499 UninitDirectSound(); |
a7d080bc610f
ao dsound improvements patch by Florian Dietrich <flodt8 at yahoo.de>
faust3
parents:
13460
diff
changeset
|
500 mp_msg(MSGT_AO, MSGL_ERR,"ao_dsound: cannot create primary buffer (%s)\n", dserr2str(res)); |
a7d080bc610f
ao dsound improvements patch by Florian Dietrich <flodt8 at yahoo.de>
faust3
parents:
13460
diff
changeset
|
501 return 0; |
a7d080bc610f
ao dsound improvements patch by Florian Dietrich <flodt8 at yahoo.de>
faust3
parents:
13460
diff
changeset
|
502 } |
a7d080bc610f
ao dsound improvements patch by Florian Dietrich <flodt8 at yahoo.de>
faust3
parents:
13460
diff
changeset
|
503 res = IDirectSoundBuffer_SetFormat( hdspribuf, (WAVEFORMATEX *)&wformat ); |
a7d080bc610f
ao dsound improvements patch by Florian Dietrich <flodt8 at yahoo.de>
faust3
parents:
13460
diff
changeset
|
504 if ( res != DS_OK ) mp_msg(MSGT_AO, MSGL_WARN,"ao_dsound: cannot set primary buffer format (%s), using standard setting (bad quality)", dserr2str(res)); |
a7d080bc610f
ao dsound improvements patch by Florian Dietrich <flodt8 at yahoo.de>
faust3
parents:
13460
diff
changeset
|
505 |
13674
b7322244e53c
channel reorder patch by Florian Dietrich <flodt8 at yahoo.de>
faust3
parents:
13640
diff
changeset
|
506 mp_msg(MSGT_AO, MSGL_V, "ao_dsound: primary buffer created\n"); |
b7322244e53c
channel reorder patch by Florian Dietrich <flodt8 at yahoo.de>
faust3
parents:
13640
diff
changeset
|
507 |
13640
a7d080bc610f
ao dsound improvements patch by Florian Dietrich <flodt8 at yahoo.de>
faust3
parents:
13460
diff
changeset
|
508 // now create the stream buffer |
13460
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
509 |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
510 res = IDirectSound_CreateSoundBuffer(hds, &dsbdesc, &hdsbuf, NULL); |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
511 if (res != DS_OK) { |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
512 if (dsbdesc.dwFlags & DSBCAPS_LOCHARDWARE) { |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
513 // Try without DSBCAPS_LOCHARDWARE |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
514 dsbdesc.dwFlags &= ~DSBCAPS_LOCHARDWARE; |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
515 res = IDirectSound_CreateSoundBuffer(hds, &dsbdesc, &hdsbuf, NULL); |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
516 } |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
517 if (res != DS_OK) { |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
518 UninitDirectSound(); |
13640
a7d080bc610f
ao dsound improvements patch by Florian Dietrich <flodt8 at yahoo.de>
faust3
parents:
13460
diff
changeset
|
519 mp_msg(MSGT_AO, MSGL_ERR, "ao_dsound: cannot create secondary (stream)buffer (%s)\n", dserr2str(res)); |
13460
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
520 return 0; |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
521 } |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
522 } |
13640
a7d080bc610f
ao dsound improvements patch by Florian Dietrich <flodt8 at yahoo.de>
faust3
parents:
13460
diff
changeset
|
523 mp_msg(MSGT_AO, MSGL_V, "ao_dsound: secondary (stream)buffer created\n"); |
13460
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
524 return 1; |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
525 } |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
526 |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
527 |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
528 |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
529 /** |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
530 \brief stop playing and empty buffers (for seeking/pause) |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
531 */ |
18915
99e20a22d5d0
modifies function declarations without parameters from ()
reynaldo
parents:
16972
diff
changeset
|
532 static void reset(void) |
13460
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
533 { |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
534 IDirectSoundBuffer_Stop(hdsbuf); |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
535 // reset directsound buffer |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
536 IDirectSoundBuffer_SetCurrentPosition(hdsbuf, 0); |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
537 write_offset=0; |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
538 } |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
539 |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
540 /** |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
541 \brief stop playing, keep buffers (for pause) |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
542 */ |
18915
99e20a22d5d0
modifies function declarations without parameters from ()
reynaldo
parents:
16972
diff
changeset
|
543 static void audio_pause(void) |
13460
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
544 { |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
545 IDirectSoundBuffer_Stop(hdsbuf); |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
546 } |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
547 |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
548 /** |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
549 \brief resume playing, after audio_pause() |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
550 */ |
18915
99e20a22d5d0
modifies function declarations without parameters from ()
reynaldo
parents:
16972
diff
changeset
|
551 static void audio_resume(void) |
13460
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
552 { |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
553 IDirectSoundBuffer_Play(hdsbuf, 0, 0, DSBPLAY_LOOPING); |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
554 } |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
555 |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28823
diff
changeset
|
556 /** |
13460
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
557 \brief close audio device |
14555
6fb9eca97d41
support immed flag, always initialize write_offset, min_free_space doesn't seem to be required anymore after Florian Dietrichs patches
faust3
parents:
14479
diff
changeset
|
558 \param immed stop playback immediately |
13460
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
559 */ |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
560 static void uninit(int immed) |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
561 { |
14555
6fb9eca97d41
support immed flag, always initialize write_offset, min_free_space doesn't seem to be required anymore after Florian Dietrichs patches
faust3
parents:
14479
diff
changeset
|
562 if(immed)reset(); |
6fb9eca97d41
support immed flag, always initialize write_offset, min_free_space doesn't seem to be required anymore after Florian Dietrichs patches
faust3
parents:
14479
diff
changeset
|
563 else{ |
6fb9eca97d41
support immed flag, always initialize write_offset, min_free_space doesn't seem to be required anymore after Florian Dietrichs patches
faust3
parents:
14479
diff
changeset
|
564 DWORD status; |
6fb9eca97d41
support immed flag, always initialize write_offset, min_free_space doesn't seem to be required anymore after Florian Dietrichs patches
faust3
parents:
14479
diff
changeset
|
565 IDirectSoundBuffer_Play(hdsbuf, 0, 0, 0); |
6fb9eca97d41
support immed flag, always initialize write_offset, min_free_space doesn't seem to be required anymore after Florian Dietrichs patches
faust3
parents:
14479
diff
changeset
|
566 while(!IDirectSoundBuffer_GetStatus(hdsbuf,&status) && (status&DSBSTATUS_PLAYING)) |
6fb9eca97d41
support immed flag, always initialize write_offset, min_free_space doesn't seem to be required anymore after Florian Dietrichs patches
faust3
parents:
14479
diff
changeset
|
567 usec_sleep(20000); |
6fb9eca97d41
support immed flag, always initialize write_offset, min_free_space doesn't seem to be required anymore after Florian Dietrichs patches
faust3
parents:
14479
diff
changeset
|
568 } |
13460
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
569 DestroyBuffer(); |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
570 UninitDirectSound(); |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
571 } |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
572 |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
573 /** |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
574 \brief find out how many bytes can be written into the audio buffer without |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
575 \return free space in bytes, has to return 0 if the buffer is almost full |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
576 */ |
18915
99e20a22d5d0
modifies function declarations without parameters from ()
reynaldo
parents:
16972
diff
changeset
|
577 static int get_space(void) |
13460
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
578 { |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
579 int space; |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
580 DWORD play_offset; |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
581 IDirectSoundBuffer_GetCurrentPosition(hdsbuf,&play_offset,NULL); |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28823
diff
changeset
|
582 space=buffer_size-(write_offset-play_offset); |
13460
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
583 // | | <-- const --> | | | |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
584 // buffer start play_cursor write_cursor write_offset buffer end |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
585 // play_cursor is the actual postion of the play cursor |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
586 // write_cursor is the position after which it is assumed to be save to write data |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
587 // write_offset is the postion where we actually write the data to |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
588 if(space > buffer_size)space -= buffer_size; // write_offset < play_offset |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
589 if(space < min_free_space)return 0; |
14947
2f4f347bd5e4
get_space fix by Florian Dietrich <flodt8 at yahoo.de>
faust3
parents:
14555
diff
changeset
|
590 return space-min_free_space; |
13460
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
591 } |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
592 |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
593 /** |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
594 \brief play 'len' bytes of 'data' |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
595 \param data pointer to the data to play |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
596 \param len size in bytes of the data buffer, gets rounded down to outburst*n |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
597 \param flags currently unused |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
598 \return number of played bytes |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
599 */ |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
600 static int play(void* data, int len, int flags) |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
601 { |
13674
b7322244e53c
channel reorder patch by Florian Dietrich <flodt8 at yahoo.de>
faust3
parents:
13640
diff
changeset
|
602 DWORD play_offset; |
b7322244e53c
channel reorder patch by Florian Dietrich <flodt8 at yahoo.de>
faust3
parents:
13640
diff
changeset
|
603 int space; |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28823
diff
changeset
|
604 |
13674
b7322244e53c
channel reorder patch by Florian Dietrich <flodt8 at yahoo.de>
faust3
parents:
13640
diff
changeset
|
605 // make sure we have enough space to write data |
b7322244e53c
channel reorder patch by Florian Dietrich <flodt8 at yahoo.de>
faust3
parents:
13640
diff
changeset
|
606 IDirectSoundBuffer_GetCurrentPosition(hdsbuf,&play_offset,NULL); |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28823
diff
changeset
|
607 space=buffer_size-(write_offset-play_offset); |
13674
b7322244e53c
channel reorder patch by Florian Dietrich <flodt8 at yahoo.de>
faust3
parents:
13640
diff
changeset
|
608 if(space > buffer_size)space -= buffer_size; // write_offset < play_offset |
b7322244e53c
channel reorder patch by Florian Dietrich <flodt8 at yahoo.de>
faust3
parents:
13640
diff
changeset
|
609 if(space < len) len = space; |
b7322244e53c
channel reorder patch by Florian Dietrich <flodt8 at yahoo.de>
faust3
parents:
13640
diff
changeset
|
610 |
20250
7cfd3a04d537
Implement AOPLAY_FINAL_CHUNK support for dshow and win32 out.
reimar
parents:
19614
diff
changeset
|
611 if (!(flags & AOPLAY_FINAL_CHUNK)) |
13460
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
612 len = (len / ao_data.outburst) * ao_data.outburst; |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
613 return write_buffer(data, len); |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
614 } |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
615 |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
616 /** |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
617 \brief get the delay between the first and last sample in the buffer |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
618 \return delay in seconds |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
619 */ |
18915
99e20a22d5d0
modifies function declarations without parameters from ()
reynaldo
parents:
16972
diff
changeset
|
620 static float get_delay(void) |
13460
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
621 { |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
622 DWORD play_offset; |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
623 int space; |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
624 IDirectSoundBuffer_GetCurrentPosition(hdsbuf,&play_offset,NULL); |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28823
diff
changeset
|
625 space=play_offset-write_offset; |
13460
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
626 if(space <= 0)space += buffer_size; |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
627 return (float)(buffer_size - space) / (float)ao_data.bps; |
70d8f1975fc8
directsound audio output plugin, patch by Gabor Szecsi <deje at miki.hu> some minor modifications by me
faust3
parents:
diff
changeset
|
628 } |