annotate libao2/ao_pcm.c @ 33804:254e56b1e39d

configure: drop check for -lposix4 This test was added in 2001 for Solaris versions that were old even then. Such Solaris versions are no longer supported and very unlikely to be used.
author diego
date Sat, 23 Jul 2011 19:33:00 +0000
parents 8cfe525f0ec0
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
28343
e45b08f2f5d3 Add standard license headers.
diego
parents: 26605
diff changeset
1 /*
e45b08f2f5d3 Add standard license headers.
diego
parents: 26605
diff changeset
2 * PCM audio output driver
e45b08f2f5d3 Add standard license headers.
diego
parents: 26605
diff changeset
3 *
e45b08f2f5d3 Add standard license headers.
diego
parents: 26605
diff changeset
4 * This file is part of MPlayer.
e45b08f2f5d3 Add standard license headers.
diego
parents: 26605
diff changeset
5 *
e45b08f2f5d3 Add standard license headers.
diego
parents: 26605
diff changeset
6 * MPlayer is free software; you can redistribute it and/or modify
e45b08f2f5d3 Add standard license headers.
diego
parents: 26605
diff changeset
7 * it under the terms of the GNU General Public License as published by
e45b08f2f5d3 Add standard license headers.
diego
parents: 26605
diff changeset
8 * the Free Software Foundation; either version 2 of the License, or
e45b08f2f5d3 Add standard license headers.
diego
parents: 26605
diff changeset
9 * (at your option) any later version.
e45b08f2f5d3 Add standard license headers.
diego
parents: 26605
diff changeset
10 *
e45b08f2f5d3 Add standard license headers.
diego
parents: 26605
diff changeset
11 * MPlayer is distributed in the hope that it will be useful,
e45b08f2f5d3 Add standard license headers.
diego
parents: 26605
diff changeset
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
e45b08f2f5d3 Add standard license headers.
diego
parents: 26605
diff changeset
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
e45b08f2f5d3 Add standard license headers.
diego
parents: 26605
diff changeset
14 * GNU General Public License for more details.
e45b08f2f5d3 Add standard license headers.
diego
parents: 26605
diff changeset
15 *
e45b08f2f5d3 Add standard license headers.
diego
parents: 26605
diff changeset
16 * You should have received a copy of the GNU General Public License along
e45b08f2f5d3 Add standard license headers.
diego
parents: 26605
diff changeset
17 * with MPlayer; if not, write to the Free Software Foundation, Inc.,
e45b08f2f5d3 Add standard license headers.
diego
parents: 26605
diff changeset
18 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
e45b08f2f5d3 Add standard license headers.
diego
parents: 26605
diff changeset
19 */
e45b08f2f5d3 Add standard license headers.
diego
parents: 26605
diff changeset
20
6237
2eec40929570 warning fixes (string.h is required for memset)
pl
parents: 5837
diff changeset
21 #include "config.h"
2eec40929570 warning fixes (string.h is required for memset)
pl
parents: 5837
diff changeset
22
1107
9d764880d989 Added raw PCM writer ao driver.
atmosfear
parents:
diff changeset
23 #include <stdio.h>
9d764880d989 Added raw PCM writer ao driver.
atmosfear
parents:
diff changeset
24 #include <stdlib.h>
6237
2eec40929570 warning fixes (string.h is required for memset)
pl
parents: 5837
diff changeset
25 #include <string.h>
1107
9d764880d989 Added raw PCM writer ao driver.
atmosfear
parents:
diff changeset
26
21372
1767c271d710 Remove bswap.h, use libavutil/bswap.h instead.
diego
parents: 21250
diff changeset
27 #include "libavutil/common.h"
21507
fa99b3d31d13 Hack around libavutil/bswap.h compilation problems due to always_inline undefined.
reimar
parents: 21372
diff changeset
28 #include "mpbswap.h"
14298
3c818342a02b Add -ao pcm suboptions and remove -aofile and -waveheader options.
reimar
parents: 14264
diff changeset
29 #include "subopt-helper.h"
14245
815f03b7cee5 removing AFMT_ dependancy
alex
parents: 14123
diff changeset
30 #include "libaf/af_format.h"
25315
dfa8a510c81c Fix all current known multi-channel wrong order problems by adding
ulion
parents: 25097
diff changeset
31 #include "libaf/reorder_ch.h"
32087
dd75bae40633 Add explanatory comment for video_out.h #inclusion in libao2/.
diego
parents: 31997
diff changeset
32 #include "libvo/video_out.h" /* only for vo_pts */
1107
9d764880d989 Added raw PCM writer ao driver.
atmosfear
parents:
diff changeset
33 #include "audio_out.h"
9d764880d989 Added raw PCM writer ao driver.
atmosfear
parents:
diff changeset
34 #include "audio_out_internal.h"
14123
a92101a7eb49 Make include paths consistent.
diego
parents: 13383
diff changeset
35 #include "mp_msg.h"
a92101a7eb49 Make include paths consistent.
diego
parents: 13383
diff changeset
36 #include "help_mp.h"
13383
c1955840883d mp_msg transition of unmaintained audio output drivers.
ivo
parents: 12145
diff changeset
37
29269
4d9de809b174 Add a hack to detect when we are writing into a Windows pipe since the fseek
reimar
parents: 29263
diff changeset
38 #ifdef __MINGW32__
4d9de809b174 Add a hack to detect when we are writing into a Windows pipe since the fseek
reimar
parents: 29263
diff changeset
39 // for GetFileType to detect pipes
4d9de809b174 Add a hack to detect when we are writing into a Windows pipe since the fseek
reimar
parents: 29263
diff changeset
40 #include <windows.h>
33254
8cfe525f0ec0 ao_pcm: Fix compilation on MinGW64 due to a missing io.h #include.
diego
parents: 32537
diff changeset
41 #include <io.h>
29269
4d9de809b174 Add a hack to detect when we are writing into a Windows pipe since the fseek
reimar
parents: 29263
diff changeset
42 #endif
1107
9d764880d989 Added raw PCM writer ao driver.
atmosfear
parents:
diff changeset
43
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29002
diff changeset
44 static const ao_info_t info =
1107
9d764880d989 Added raw PCM writer ao driver.
atmosfear
parents:
diff changeset
45 {
29001
1bb13b69cc9e Whitespace-only cosmetics: use consistent indentation in ao_pcm.c
reimar
parents: 29000
diff changeset
46 "RAW PCM/WAVE file writer audio output",
1bb13b69cc9e Whitespace-only cosmetics: use consistent indentation in ao_pcm.c
reimar
parents: 29000
diff changeset
47 "pcm",
1bb13b69cc9e Whitespace-only cosmetics: use consistent indentation in ao_pcm.c
reimar
parents: 29000
diff changeset
48 "Atmosfear",
1bb13b69cc9e Whitespace-only cosmetics: use consistent indentation in ao_pcm.c
reimar
parents: 29000
diff changeset
49 ""
1107
9d764880d989 Added raw PCM writer ao driver.
atmosfear
parents:
diff changeset
50 };
9d764880d989 Added raw PCM writer ao driver.
atmosfear
parents:
diff changeset
51
9d764880d989 Added raw PCM writer ao driver.
atmosfear
parents:
diff changeset
52 LIBAO_EXTERN(pcm)
9d764880d989 Added raw PCM writer ao driver.
atmosfear
parents:
diff changeset
53
14298
3c818342a02b Add -ao pcm suboptions and remove -aofile and -waveheader options.
reimar
parents: 14264
diff changeset
54 static char *ao_outputfilename = NULL;
3c818342a02b Add -ao pcm suboptions and remove -aofile and -waveheader options.
reimar
parents: 14264
diff changeset
55 static int ao_pcm_waveheader = 1;
18092
96fdfbad5b1a -ao pcm:fast suboption for faster-than-realtime dumping
reimar
parents: 17566
diff changeset
56 static int fast = 0;
1112
b1cf1087ec33 Added support for writing wave files and specifying filename to write to.
atmosfear
parents: 1107
diff changeset
57
b1cf1087ec33 Added support for writing wave files and specifying filename to write to.
atmosfear
parents: 1107
diff changeset
58 #define WAV_ID_RIFF 0x46464952 /* "RIFF" */
b1cf1087ec33 Added support for writing wave files and specifying filename to write to.
atmosfear
parents: 1107
diff changeset
59 #define WAV_ID_WAVE 0x45564157 /* "WAVE" */
b1cf1087ec33 Added support for writing wave files and specifying filename to write to.
atmosfear
parents: 1107
diff changeset
60 #define WAV_ID_FMT 0x20746d66 /* "fmt " */
b1cf1087ec33 Added support for writing wave files and specifying filename to write to.
atmosfear
parents: 1107
diff changeset
61 #define WAV_ID_DATA 0x61746164 /* "data" */
b1cf1087ec33 Added support for writing wave files and specifying filename to write to.
atmosfear
parents: 1107
diff changeset
62 #define WAV_ID_PCM 0x0001
26604
9946e4a6e457 Support 32 bit float and integer formats in ao_pcm.c
reimar
parents: 25315
diff changeset
63 #define WAV_ID_FLOAT_PCM 0x0003
30666
b20827f16dd0 Output WAVE_FORMAT_EXTENSIBLE extension in wave header when waveheader
tack
parents: 30633
diff changeset
64 #define WAV_ID_FORMAT_EXTENSIBLE 0xfffe
1112
b1cf1087ec33 Added support for writing wave files and specifying filename to write to.
atmosfear
parents: 1107
diff changeset
65
5837
7e082f42497a - Fix for big apple architectures by Rogerio Brito, reworked by me to use bswap.h macros.
atmos4
parents: 4914
diff changeset
66 /* init with default values */
29002
b7367b035fdd Add forgotten "static" to new data_length variable in ao_pcm
reimar
parents: 29001
diff changeset
67 static uint64_t data_length;
30666
b20827f16dd0 Output WAVE_FORMAT_EXTENSIBLE extension in wave header when waveheader
tack
parents: 30633
diff changeset
68 static FILE *fp = NULL;
1112
b1cf1087ec33 Added support for writing wave files and specifying filename to write to.
atmosfear
parents: 1107
diff changeset
69
30666
b20827f16dd0 Output WAVE_FORMAT_EXTENSIBLE extension in wave header when waveheader
tack
parents: 30633
diff changeset
70
b20827f16dd0 Output WAVE_FORMAT_EXTENSIBLE extension in wave header when waveheader
tack
parents: 30633
diff changeset
71 static void fput16le(uint16_t val, FILE *fp) {
b20827f16dd0 Output WAVE_FORMAT_EXTENSIBLE extension in wave header when waveheader
tack
parents: 30633
diff changeset
72 uint8_t bytes[2] = {val, val >> 8};
b20827f16dd0 Output WAVE_FORMAT_EXTENSIBLE extension in wave header when waveheader
tack
parents: 30633
diff changeset
73 fwrite(bytes, 1, 2, fp);
b20827f16dd0 Output WAVE_FORMAT_EXTENSIBLE extension in wave header when waveheader
tack
parents: 30633
diff changeset
74 }
b20827f16dd0 Output WAVE_FORMAT_EXTENSIBLE extension in wave header when waveheader
tack
parents: 30633
diff changeset
75
b20827f16dd0 Output WAVE_FORMAT_EXTENSIBLE extension in wave header when waveheader
tack
parents: 30633
diff changeset
76 static void fput32le(uint32_t val, FILE *fp) {
b20827f16dd0 Output WAVE_FORMAT_EXTENSIBLE extension in wave header when waveheader
tack
parents: 30633
diff changeset
77 uint8_t bytes[4] = {val, val >> 8, val >> 16, val >> 24};
b20827f16dd0 Output WAVE_FORMAT_EXTENSIBLE extension in wave header when waveheader
tack
parents: 30633
diff changeset
78 fwrite(bytes, 1, 4, fp);
b20827f16dd0 Output WAVE_FORMAT_EXTENSIBLE extension in wave header when waveheader
tack
parents: 30633
diff changeset
79 }
b20827f16dd0 Output WAVE_FORMAT_EXTENSIBLE extension in wave header when waveheader
tack
parents: 30633
diff changeset
80
b20827f16dd0 Output WAVE_FORMAT_EXTENSIBLE extension in wave header when waveheader
tack
parents: 30633
diff changeset
81 static void write_wave_header(FILE *fp, uint64_t data_length) {
b20827f16dd0 Output WAVE_FORMAT_EXTENSIBLE extension in wave header when waveheader
tack
parents: 30633
diff changeset
82 int use_waveex = (ao_data.channels >= 5 && ao_data.channels <= 8);
b20827f16dd0 Output WAVE_FORMAT_EXTENSIBLE extension in wave header when waveheader
tack
parents: 30633
diff changeset
83 uint16_t fmt = (ao_data.format == AF_FORMAT_FLOAT_LE) ? WAV_ID_FLOAT_PCM : WAV_ID_PCM;
b20827f16dd0 Output WAVE_FORMAT_EXTENSIBLE extension in wave header when waveheader
tack
parents: 30633
diff changeset
84 uint32_t fmt_chunk_size = use_waveex ? 40 : 16;
b20827f16dd0 Output WAVE_FORMAT_EXTENSIBLE extension in wave header when waveheader
tack
parents: 30633
diff changeset
85 int bits = af_fmt2bits(ao_data.format);
b20827f16dd0 Output WAVE_FORMAT_EXTENSIBLE extension in wave header when waveheader
tack
parents: 30633
diff changeset
86
b20827f16dd0 Output WAVE_FORMAT_EXTENSIBLE extension in wave header when waveheader
tack
parents: 30633
diff changeset
87 // Master RIFF chunk
b20827f16dd0 Output WAVE_FORMAT_EXTENSIBLE extension in wave header when waveheader
tack
parents: 30633
diff changeset
88 fput32le(WAV_ID_RIFF, fp);
b20827f16dd0 Output WAVE_FORMAT_EXTENSIBLE extension in wave header when waveheader
tack
parents: 30633
diff changeset
89 // RIFF chunk size: 'WAVE' + 'fmt ' + 4 + fmt_chunk_size + data chunk hdr (8) + data length
b20827f16dd0 Output WAVE_FORMAT_EXTENSIBLE extension in wave header when waveheader
tack
parents: 30633
diff changeset
90 fput32le(12 + fmt_chunk_size + 8 + data_length, fp);
b20827f16dd0 Output WAVE_FORMAT_EXTENSIBLE extension in wave header when waveheader
tack
parents: 30633
diff changeset
91 fput32le(WAV_ID_WAVE, fp);
b20827f16dd0 Output WAVE_FORMAT_EXTENSIBLE extension in wave header when waveheader
tack
parents: 30633
diff changeset
92
b20827f16dd0 Output WAVE_FORMAT_EXTENSIBLE extension in wave header when waveheader
tack
parents: 30633
diff changeset
93 // Format chunk
b20827f16dd0 Output WAVE_FORMAT_EXTENSIBLE extension in wave header when waveheader
tack
parents: 30633
diff changeset
94 fput32le(WAV_ID_FMT, fp);
b20827f16dd0 Output WAVE_FORMAT_EXTENSIBLE extension in wave header when waveheader
tack
parents: 30633
diff changeset
95 fput32le(fmt_chunk_size, fp);
b20827f16dd0 Output WAVE_FORMAT_EXTENSIBLE extension in wave header when waveheader
tack
parents: 30633
diff changeset
96 fput16le(use_waveex ? WAV_ID_FORMAT_EXTENSIBLE : fmt, fp);
b20827f16dd0 Output WAVE_FORMAT_EXTENSIBLE extension in wave header when waveheader
tack
parents: 30633
diff changeset
97 fput16le(ao_data.channels, fp);
b20827f16dd0 Output WAVE_FORMAT_EXTENSIBLE extension in wave header when waveheader
tack
parents: 30633
diff changeset
98 fput32le(ao_data.samplerate, fp);
b20827f16dd0 Output WAVE_FORMAT_EXTENSIBLE extension in wave header when waveheader
tack
parents: 30633
diff changeset
99 fput32le(ao_data.bps, fp);
b20827f16dd0 Output WAVE_FORMAT_EXTENSIBLE extension in wave header when waveheader
tack
parents: 30633
diff changeset
100 fput16le(ao_data.channels * (bits / 8), fp);
b20827f16dd0 Output WAVE_FORMAT_EXTENSIBLE extension in wave header when waveheader
tack
parents: 30633
diff changeset
101 fput16le(bits, fp);
b20827f16dd0 Output WAVE_FORMAT_EXTENSIBLE extension in wave header when waveheader
tack
parents: 30633
diff changeset
102
b20827f16dd0 Output WAVE_FORMAT_EXTENSIBLE extension in wave header when waveheader
tack
parents: 30633
diff changeset
103 if (use_waveex) {
b20827f16dd0 Output WAVE_FORMAT_EXTENSIBLE extension in wave header when waveheader
tack
parents: 30633
diff changeset
104 // Extension chunk
b20827f16dd0 Output WAVE_FORMAT_EXTENSIBLE extension in wave header when waveheader
tack
parents: 30633
diff changeset
105 fput16le(22, fp);
b20827f16dd0 Output WAVE_FORMAT_EXTENSIBLE extension in wave header when waveheader
tack
parents: 30633
diff changeset
106 fput16le(bits, fp);
b20827f16dd0 Output WAVE_FORMAT_EXTENSIBLE extension in wave header when waveheader
tack
parents: 30633
diff changeset
107 switch (ao_data.channels) {
b20827f16dd0 Output WAVE_FORMAT_EXTENSIBLE extension in wave header when waveheader
tack
parents: 30633
diff changeset
108 case 5:
b20827f16dd0 Output WAVE_FORMAT_EXTENSIBLE extension in wave header when waveheader
tack
parents: 30633
diff changeset
109 fput32le(0x0607, fp); // L R C Lb Rb
b20827f16dd0 Output WAVE_FORMAT_EXTENSIBLE extension in wave header when waveheader
tack
parents: 30633
diff changeset
110 break;
b20827f16dd0 Output WAVE_FORMAT_EXTENSIBLE extension in wave header when waveheader
tack
parents: 30633
diff changeset
111 case 6:
b20827f16dd0 Output WAVE_FORMAT_EXTENSIBLE extension in wave header when waveheader
tack
parents: 30633
diff changeset
112 fput32le(0x060f, fp); // L R C Lb Rb LFE
b20827f16dd0 Output WAVE_FORMAT_EXTENSIBLE extension in wave header when waveheader
tack
parents: 30633
diff changeset
113 break;
b20827f16dd0 Output WAVE_FORMAT_EXTENSIBLE extension in wave header when waveheader
tack
parents: 30633
diff changeset
114 case 7:
b20827f16dd0 Output WAVE_FORMAT_EXTENSIBLE extension in wave header when waveheader
tack
parents: 30633
diff changeset
115 fput32le(0x0727, fp); // L R C Cb Ls Rs LFE
b20827f16dd0 Output WAVE_FORMAT_EXTENSIBLE extension in wave header when waveheader
tack
parents: 30633
diff changeset
116 break;
b20827f16dd0 Output WAVE_FORMAT_EXTENSIBLE extension in wave header when waveheader
tack
parents: 30633
diff changeset
117 case 8:
b20827f16dd0 Output WAVE_FORMAT_EXTENSIBLE extension in wave header when waveheader
tack
parents: 30633
diff changeset
118 fput32le(0x063f, fp); // L R C Lb Rb Ls Rs LFE
b20827f16dd0 Output WAVE_FORMAT_EXTENSIBLE extension in wave header when waveheader
tack
parents: 30633
diff changeset
119 break;
b20827f16dd0 Output WAVE_FORMAT_EXTENSIBLE extension in wave header when waveheader
tack
parents: 30633
diff changeset
120 }
b20827f16dd0 Output WAVE_FORMAT_EXTENSIBLE extension in wave header when waveheader
tack
parents: 30633
diff changeset
121 // 2 bytes format + 14 bytes guid
b20827f16dd0 Output WAVE_FORMAT_EXTENSIBLE extension in wave header when waveheader
tack
parents: 30633
diff changeset
122 fput32le(fmt, fp);
b20827f16dd0 Output WAVE_FORMAT_EXTENSIBLE extension in wave header when waveheader
tack
parents: 30633
diff changeset
123 fput32le(0x00100000, fp);
b20827f16dd0 Output WAVE_FORMAT_EXTENSIBLE extension in wave header when waveheader
tack
parents: 30633
diff changeset
124 fput32le(0xAA000080, fp);
b20827f16dd0 Output WAVE_FORMAT_EXTENSIBLE extension in wave header when waveheader
tack
parents: 30633
diff changeset
125 fput32le(0x719B3800, fp);
b20827f16dd0 Output WAVE_FORMAT_EXTENSIBLE extension in wave header when waveheader
tack
parents: 30633
diff changeset
126 }
b20827f16dd0 Output WAVE_FORMAT_EXTENSIBLE extension in wave header when waveheader
tack
parents: 30633
diff changeset
127
b20827f16dd0 Output WAVE_FORMAT_EXTENSIBLE extension in wave header when waveheader
tack
parents: 30633
diff changeset
128 // Data chunk
b20827f16dd0 Output WAVE_FORMAT_EXTENSIBLE extension in wave header when waveheader
tack
parents: 30633
diff changeset
129 fput32le(WAV_ID_DATA, fp);
b20827f16dd0 Output WAVE_FORMAT_EXTENSIBLE extension in wave header when waveheader
tack
parents: 30633
diff changeset
130 fput32le(data_length, fp);
b20827f16dd0 Output WAVE_FORMAT_EXTENSIBLE extension in wave header when waveheader
tack
parents: 30633
diff changeset
131 }
1107
9d764880d989 Added raw PCM writer ao driver.
atmosfear
parents:
diff changeset
132
9d764880d989 Added raw PCM writer ao driver.
atmosfear
parents:
diff changeset
133 // to set/get/query special features/parameters
9633
12b1790038b0 64bit libao2 fix by Jens Axboe <mplayer-dev@kernel.dk>
alex
parents: 9277
diff changeset
134 static int control(int cmd,void *arg){
1107
9d764880d989 Added raw PCM writer ao driver.
atmosfear
parents:
diff changeset
135 return -1;
9d764880d989 Added raw PCM writer ao driver.
atmosfear
parents:
diff changeset
136 }
9d764880d989 Added raw PCM writer ao driver.
atmosfear
parents:
diff changeset
137
9d764880d989 Added raw PCM writer ao driver.
atmosfear
parents:
diff changeset
138 // open & setup audio device
9d764880d989 Added raw PCM writer ao driver.
atmosfear
parents:
diff changeset
139 // return: 1=success 0=fail
9d764880d989 Added raw PCM writer ao driver.
atmosfear
parents:
diff changeset
140 static int init(int rate,int channels,int format,int flags){
29586
2eff450157cd The suboption parser now takes a const options list, so mark them all const.
reimar
parents: 29401
diff changeset
141 const opt_t subopts[] = {
29001
1bb13b69cc9e Whitespace-only cosmetics: use consistent indentation in ao_pcm.c
reimar
parents: 29000
diff changeset
142 {"waveheader", OPT_ARG_BOOL, &ao_pcm_waveheader, NULL},
1bb13b69cc9e Whitespace-only cosmetics: use consistent indentation in ao_pcm.c
reimar
parents: 29000
diff changeset
143 {"file", OPT_ARG_MSTRZ, &ao_outputfilename, NULL},
1bb13b69cc9e Whitespace-only cosmetics: use consistent indentation in ao_pcm.c
reimar
parents: 29000
diff changeset
144 {"fast", OPT_ARG_BOOL, &fast, NULL},
1bb13b69cc9e Whitespace-only cosmetics: use consistent indentation in ao_pcm.c
reimar
parents: 29000
diff changeset
145 {NULL}
1bb13b69cc9e Whitespace-only cosmetics: use consistent indentation in ao_pcm.c
reimar
parents: 29000
diff changeset
146 };
1bb13b69cc9e Whitespace-only cosmetics: use consistent indentation in ao_pcm.c
reimar
parents: 29000
diff changeset
147 // set defaults
1bb13b69cc9e Whitespace-only cosmetics: use consistent indentation in ao_pcm.c
reimar
parents: 29000
diff changeset
148 ao_pcm_waveheader = 1;
18488
b23c0e341e3e Move setting the output filename after the suboption parsing, otherwise it
diego
parents: 18092
diff changeset
149
29001
1bb13b69cc9e Whitespace-only cosmetics: use consistent indentation in ao_pcm.c
reimar
parents: 29000
diff changeset
150 if (subopt_parse(ao_subdevice, subopts) != 0) {
1bb13b69cc9e Whitespace-only cosmetics: use consistent indentation in ao_pcm.c
reimar
parents: 29000
diff changeset
151 return 0;
1bb13b69cc9e Whitespace-only cosmetics: use consistent indentation in ao_pcm.c
reimar
parents: 29000
diff changeset
152 }
1bb13b69cc9e Whitespace-only cosmetics: use consistent indentation in ao_pcm.c
reimar
parents: 29000
diff changeset
153 if (!ao_outputfilename){
1bb13b69cc9e Whitespace-only cosmetics: use consistent indentation in ao_pcm.c
reimar
parents: 29000
diff changeset
154 ao_outputfilename =
1bb13b69cc9e Whitespace-only cosmetics: use consistent indentation in ao_pcm.c
reimar
parents: 29000
diff changeset
155 strdup(ao_pcm_waveheader?"audiodump.wav":"audiodump.pcm");
1bb13b69cc9e Whitespace-only cosmetics: use consistent indentation in ao_pcm.c
reimar
parents: 29000
diff changeset
156 }
18488
b23c0e341e3e Move setting the output filename after the suboption parsing, otherwise it
diego
parents: 18092
diff changeset
157
30358
26d336c4a7a4 Support more formats for -ao pcm in raw mode.
reimar
parents: 30241
diff changeset
158 if (ao_pcm_waveheader)
26d336c4a7a4 Support more formats for -ao pcm in raw mode.
reimar
parents: 30241
diff changeset
159 {
26d336c4a7a4 Support more formats for -ao pcm in raw mode.
reimar
parents: 30241
diff changeset
160 // WAV files must have one of the following formats
26d336c4a7a4 Support more formats for -ao pcm in raw mode.
reimar
parents: 30241
diff changeset
161
26d336c4a7a4 Support more formats for -ao pcm in raw mode.
reimar
parents: 30241
diff changeset
162 switch(format){
26d336c4a7a4 Support more formats for -ao pcm in raw mode.
reimar
parents: 30241
diff changeset
163 case AF_FORMAT_U8:
26d336c4a7a4 Support more formats for -ao pcm in raw mode.
reimar
parents: 30241
diff changeset
164 case AF_FORMAT_S16_LE:
26d336c4a7a4 Support more formats for -ao pcm in raw mode.
reimar
parents: 30241
diff changeset
165 case AF_FORMAT_S24_LE:
26d336c4a7a4 Support more formats for -ao pcm in raw mode.
reimar
parents: 30241
diff changeset
166 case AF_FORMAT_S32_LE:
26d336c4a7a4 Support more formats for -ao pcm in raw mode.
reimar
parents: 30241
diff changeset
167 case AF_FORMAT_FLOAT_LE:
26d336c4a7a4 Support more formats for -ao pcm in raw mode.
reimar
parents: 30241
diff changeset
168 case AF_FORMAT_AC3_BE:
26d336c4a7a4 Support more formats for -ao pcm in raw mode.
reimar
parents: 30241
diff changeset
169 case AF_FORMAT_AC3_LE:
26d336c4a7a4 Support more formats for -ao pcm in raw mode.
reimar
parents: 30241
diff changeset
170 break;
26d336c4a7a4 Support more formats for -ao pcm in raw mode.
reimar
parents: 30241
diff changeset
171 default:
26d336c4a7a4 Support more formats for -ao pcm in raw mode.
reimar
parents: 30241
diff changeset
172 format = AF_FORMAT_S16_LE;
26d336c4a7a4 Support more formats for -ao pcm in raw mode.
reimar
parents: 30241
diff changeset
173 break;
26d336c4a7a4 Support more formats for -ao pcm in raw mode.
reimar
parents: 30241
diff changeset
174 }
29001
1bb13b69cc9e Whitespace-only cosmetics: use consistent indentation in ao_pcm.c
reimar
parents: 29000
diff changeset
175 }
7658
65037d309de3 updated for libaf rules
arpi
parents: 6941
diff changeset
176
29001
1bb13b69cc9e Whitespace-only cosmetics: use consistent indentation in ao_pcm.c
reimar
parents: 29000
diff changeset
177 ao_data.outburst = 65536;
1bb13b69cc9e Whitespace-only cosmetics: use consistent indentation in ao_pcm.c
reimar
parents: 29000
diff changeset
178 ao_data.buffersize= 2*65536;
1bb13b69cc9e Whitespace-only cosmetics: use consistent indentation in ao_pcm.c
reimar
parents: 29000
diff changeset
179 ao_data.channels=channels;
1bb13b69cc9e Whitespace-only cosmetics: use consistent indentation in ao_pcm.c
reimar
parents: 29000
diff changeset
180 ao_data.samplerate=rate;
1bb13b69cc9e Whitespace-only cosmetics: use consistent indentation in ao_pcm.c
reimar
parents: 29000
diff changeset
181 ao_data.format=format;
30666
b20827f16dd0 Output WAVE_FORMAT_EXTENSIBLE extension in wave header when waveheader
tack
parents: 30633
diff changeset
182 ao_data.bps=channels*rate*(af_fmt2bits(format)/8);
5837
7e082f42497a - Fix for big apple architectures by Rogerio Brito, reworked by me to use bswap.h macros.
atmos4
parents: 4914
diff changeset
183
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29002
diff changeset
184 mp_msg(MSGT_AO, MSGL_INFO, MSGTR_AO_PCM_FileInfo, ao_outputfilename,
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29002
diff changeset
185 (ao_pcm_waveheader?"WAVE":"RAW PCM"), rate,
29001
1bb13b69cc9e Whitespace-only cosmetics: use consistent indentation in ao_pcm.c
reimar
parents: 29000
diff changeset
186 (channels > 1) ? "Stereo" : "Mono", af_fmt2str_short(format));
1bb13b69cc9e Whitespace-only cosmetics: use consistent indentation in ao_pcm.c
reimar
parents: 29000
diff changeset
187 mp_msg(MSGT_AO, MSGL_INFO, MSGTR_AO_PCM_HintInfo);
5837
7e082f42497a - Fix for big apple architectures by Rogerio Brito, reworked by me to use bswap.h macros.
atmos4
parents: 4914
diff changeset
188
29001
1bb13b69cc9e Whitespace-only cosmetics: use consistent indentation in ao_pcm.c
reimar
parents: 29000
diff changeset
189 fp = fopen(ao_outputfilename, "wb");
1bb13b69cc9e Whitespace-only cosmetics: use consistent indentation in ao_pcm.c
reimar
parents: 29000
diff changeset
190 if(fp) {
1bb13b69cc9e Whitespace-only cosmetics: use consistent indentation in ao_pcm.c
reimar
parents: 29000
diff changeset
191 if(ao_pcm_waveheader){ /* Reserve space for wave header */
30666
b20827f16dd0 Output WAVE_FORMAT_EXTENSIBLE extension in wave header when waveheader
tack
parents: 30633
diff changeset
192 write_wave_header(fp, 0x7ffff000);
29001
1bb13b69cc9e Whitespace-only cosmetics: use consistent indentation in ao_pcm.c
reimar
parents: 29000
diff changeset
193 }
1bb13b69cc9e Whitespace-only cosmetics: use consistent indentation in ao_pcm.c
reimar
parents: 29000
diff changeset
194 return 1;
1bb13b69cc9e Whitespace-only cosmetics: use consistent indentation in ao_pcm.c
reimar
parents: 29000
diff changeset
195 }
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29002
diff changeset
196 mp_msg(MSGT_AO, MSGL_ERR, MSGTR_AO_PCM_CantOpenOutputFile,
13383
c1955840883d mp_msg transition of unmaintained audio output drivers.
ivo
parents: 12145
diff changeset
197 ao_outputfilename);
29001
1bb13b69cc9e Whitespace-only cosmetics: use consistent indentation in ao_pcm.c
reimar
parents: 29000
diff changeset
198 return 0;
1107
9d764880d989 Added raw PCM writer ao driver.
atmosfear
parents:
diff changeset
199 }
9d764880d989 Added raw PCM writer ao driver.
atmosfear
parents:
diff changeset
200
9d764880d989 Added raw PCM writer ao driver.
atmosfear
parents:
diff changeset
201 // close audio device
12145
99798c3cdb93 uninit immed flag
alex
parents: 11270
diff changeset
202 static void uninit(int immed){
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29002
diff changeset
203
29001
1bb13b69cc9e Whitespace-only cosmetics: use consistent indentation in ao_pcm.c
reimar
parents: 29000
diff changeset
204 if(ao_pcm_waveheader){ /* Rewrite wave header */
29269
4d9de809b174 Add a hack to detect when we are writing into a Windows pipe since the fseek
reimar
parents: 29263
diff changeset
205 int broken_seek = 0;
4d9de809b174 Add a hack to detect when we are writing into a Windows pipe since the fseek
reimar
parents: 29263
diff changeset
206 #ifdef __MINGW32__
4d9de809b174 Add a hack to detect when we are writing into a Windows pipe since the fseek
reimar
parents: 29263
diff changeset
207 // Windows, in its usual idiocy "emulates" seeks on pipes so it always looks
4d9de809b174 Add a hack to detect when we are writing into a Windows pipe since the fseek
reimar
parents: 29263
diff changeset
208 // like they work. So we have to detect them brute-force.
4d9de809b174 Add a hack to detect when we are writing into a Windows pipe since the fseek
reimar
parents: 29263
diff changeset
209 broken_seek = GetFileType((HANDLE)_get_osfhandle(_fileno(fp))) != FILE_TYPE_DISK;
4d9de809b174 Add a hack to detect when we are writing into a Windows pipe since the fseek
reimar
parents: 29263
diff changeset
210 #endif
4d9de809b174 Add a hack to detect when we are writing into a Windows pipe since the fseek
reimar
parents: 29263
diff changeset
211 if (broken_seek || fseek(fp, 0, SEEK_SET) != 0)
29001
1bb13b69cc9e Whitespace-only cosmetics: use consistent indentation in ao_pcm.c
reimar
parents: 29000
diff changeset
212 mp_msg(MSGT_AO, MSGL_ERR, "Could not seek to start, WAV size headers not updated!\n");
1bb13b69cc9e Whitespace-only cosmetics: use consistent indentation in ao_pcm.c
reimar
parents: 29000
diff changeset
213 else {
31132
f5478d5be47e Change WAV header updating in ao_pcm to allow to up to almost 4GB size.
reimar
parents: 30666
diff changeset
214 if (data_length > 0xfffff000) {
f5478d5be47e Change WAV header updating in ao_pcm to allow to up to almost 4GB size.
reimar
parents: 30666
diff changeset
215 mp_msg(MSGT_AO, MSGL_ERR, "File larger than allowed for WAV files, may play truncated!\n");
f5478d5be47e Change WAV header updating in ao_pcm to allow to up to almost 4GB size.
reimar
parents: 30666
diff changeset
216 data_length = 0xfffff000;
f5478d5be47e Change WAV header updating in ao_pcm to allow to up to almost 4GB size.
reimar
parents: 30666
diff changeset
217 }
30666
b20827f16dd0 Output WAVE_FORMAT_EXTENSIBLE extension in wave header when waveheader
tack
parents: 30633
diff changeset
218 write_wave_header(fp, data_length);
29001
1bb13b69cc9e Whitespace-only cosmetics: use consistent indentation in ao_pcm.c
reimar
parents: 29000
diff changeset
219 }
1bb13b69cc9e Whitespace-only cosmetics: use consistent indentation in ao_pcm.c
reimar
parents: 29000
diff changeset
220 }
1bb13b69cc9e Whitespace-only cosmetics: use consistent indentation in ao_pcm.c
reimar
parents: 29000
diff changeset
221 fclose(fp);
32537
8fa2f43cb760 Remove most of the NULL pointer check before free all over the code
cboesch
parents: 32087
diff changeset
222 free(ao_outputfilename);
29001
1bb13b69cc9e Whitespace-only cosmetics: use consistent indentation in ao_pcm.c
reimar
parents: 29000
diff changeset
223 ao_outputfilename = NULL;
1107
9d764880d989 Added raw PCM writer ao driver.
atmosfear
parents:
diff changeset
224 }
9d764880d989 Added raw PCM writer ao driver.
atmosfear
parents:
diff changeset
225
9d764880d989 Added raw PCM writer ao driver.
atmosfear
parents:
diff changeset
226 // stop playing and empty buffers (for seeking/pause)
17566
f580a7755ac5 Patch by Stefan Huehner / stefan % huehner ! org \
rathann
parents: 16243
diff changeset
227 static void reset(void){
1107
9d764880d989 Added raw PCM writer ao driver.
atmosfear
parents:
diff changeset
228
9d764880d989 Added raw PCM writer ao driver.
atmosfear
parents:
diff changeset
229 }
9d764880d989 Added raw PCM writer ao driver.
atmosfear
parents:
diff changeset
230
9d764880d989 Added raw PCM writer ao driver.
atmosfear
parents:
diff changeset
231 // stop playing, keep buffers (for pause)
17566
f580a7755ac5 Patch by Stefan Huehner / stefan % huehner ! org \
rathann
parents: 16243
diff changeset
232 static void audio_pause(void)
1107
9d764880d989 Added raw PCM writer ao driver.
atmosfear
parents:
diff changeset
233 {
9d764880d989 Added raw PCM writer ao driver.
atmosfear
parents:
diff changeset
234 // for now, just call reset();
9d764880d989 Added raw PCM writer ao driver.
atmosfear
parents:
diff changeset
235 reset();
9d764880d989 Added raw PCM writer ao driver.
atmosfear
parents:
diff changeset
236 }
9d764880d989 Added raw PCM writer ao driver.
atmosfear
parents:
diff changeset
237
9d764880d989 Added raw PCM writer ao driver.
atmosfear
parents:
diff changeset
238 // resume playing, after audio_pause()
17566
f580a7755ac5 Patch by Stefan Huehner / stefan % huehner ! org \
rathann
parents: 16243
diff changeset
239 static void audio_resume(void)
1107
9d764880d989 Added raw PCM writer ao driver.
atmosfear
parents:
diff changeset
240 {
9d764880d989 Added raw PCM writer ao driver.
atmosfear
parents:
diff changeset
241 }
9d764880d989 Added raw PCM writer ao driver.
atmosfear
parents:
diff changeset
242
9d764880d989 Added raw PCM writer ao driver.
atmosfear
parents:
diff changeset
243 // return: how many bytes can be played without blocking
17566
f580a7755ac5 Patch by Stefan Huehner / stefan % huehner ! org \
rathann
parents: 16243
diff changeset
244 static int get_space(void){
1107
9d764880d989 Added raw PCM writer ao driver.
atmosfear
parents:
diff changeset
245
5837
7e082f42497a - Fix for big apple architectures by Rogerio Brito, reworked by me to use bswap.h macros.
atmos4
parents: 4914
diff changeset
246 if(vo_pts)
29001
1bb13b69cc9e Whitespace-only cosmetics: use consistent indentation in ao_pcm.c
reimar
parents: 29000
diff changeset
247 return ao_data.pts < vo_pts + fast * 30000 ? ao_data.outburst : 0;
5837
7e082f42497a - Fix for big apple architectures by Rogerio Brito, reworked by me to use bswap.h macros.
atmos4
parents: 4914
diff changeset
248 return ao_data.outburst;
1107
9d764880d989 Added raw PCM writer ao driver.
atmosfear
parents:
diff changeset
249 }
9d764880d989 Added raw PCM writer ao driver.
atmosfear
parents:
diff changeset
250
9d764880d989 Added raw PCM writer ao driver.
atmosfear
parents:
diff changeset
251 // plays 'len' bytes of 'data'
9d764880d989 Added raw PCM writer ao driver.
atmosfear
parents:
diff changeset
252 // it should round it down to outburst*n
9d764880d989 Added raw PCM writer ao driver.
atmosfear
parents:
diff changeset
253 // return: number of bytes played
9d764880d989 Added raw PCM writer ao driver.
atmosfear
parents:
diff changeset
254 static int play(void* data,int len,int flags){
9d764880d989 Added raw PCM writer ao driver.
atmosfear
parents:
diff changeset
255
29826
4eae69f3f4f4 Add support for 8 channel audio.
tack
parents: 29586
diff changeset
256 if (ao_data.channels == 5 || ao_data.channels == 6 || ao_data.channels == 8) {
30666
b20827f16dd0 Output WAVE_FORMAT_EXTENSIBLE extension in wave header when waveheader
tack
parents: 30633
diff changeset
257 int frame_size = af_fmt2bits(ao_data.format) / 8;
29001
1bb13b69cc9e Whitespace-only cosmetics: use consistent indentation in ao_pcm.c
reimar
parents: 29000
diff changeset
258 len -= len % (frame_size * ao_data.channels);
1bb13b69cc9e Whitespace-only cosmetics: use consistent indentation in ao_pcm.c
reimar
parents: 29000
diff changeset
259 reorder_channel_nch(data, AF_CHANNEL_LAYOUT_MPLAYER_DEFAULT,
1bb13b69cc9e Whitespace-only cosmetics: use consistent indentation in ao_pcm.c
reimar
parents: 29000
diff changeset
260 AF_CHANNEL_LAYOUT_WAVEEX_DEFAULT,
1bb13b69cc9e Whitespace-only cosmetics: use consistent indentation in ao_pcm.c
reimar
parents: 29000
diff changeset
261 ao_data.channels,
1bb13b69cc9e Whitespace-only cosmetics: use consistent indentation in ao_pcm.c
reimar
parents: 29000
diff changeset
262 len / frame_size, frame_size);
1bb13b69cc9e Whitespace-only cosmetics: use consistent indentation in ao_pcm.c
reimar
parents: 29000
diff changeset
263 }
25315
dfa8a510c81c Fix all current known multi-channel wrong order problems by adding
ulion
parents: 25097
diff changeset
264
29001
1bb13b69cc9e Whitespace-only cosmetics: use consistent indentation in ao_pcm.c
reimar
parents: 29000
diff changeset
265 //printf("PCM: Writing chunk!\n");
1bb13b69cc9e Whitespace-only cosmetics: use consistent indentation in ao_pcm.c
reimar
parents: 29000
diff changeset
266 fwrite(data,len,1,fp);
5837
7e082f42497a - Fix for big apple architectures by Rogerio Brito, reworked by me to use bswap.h macros.
atmos4
parents: 4914
diff changeset
267
29001
1bb13b69cc9e Whitespace-only cosmetics: use consistent indentation in ao_pcm.c
reimar
parents: 29000
diff changeset
268 if(ao_pcm_waveheader)
1bb13b69cc9e Whitespace-only cosmetics: use consistent indentation in ao_pcm.c
reimar
parents: 29000
diff changeset
269 data_length += len;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29002
diff changeset
270
29001
1bb13b69cc9e Whitespace-only cosmetics: use consistent indentation in ao_pcm.c
reimar
parents: 29000
diff changeset
271 return len;
1107
9d764880d989 Added raw PCM writer ao driver.
atmosfear
parents:
diff changeset
272 }
9d764880d989 Added raw PCM writer ao driver.
atmosfear
parents:
diff changeset
273
3095
981a9e5118ce interface to libao2 changed ao_plugin added
anders
parents: 1113
diff changeset
274 // return: delay in seconds between first and last sample in buffer
17566
f580a7755ac5 Patch by Stefan Huehner / stefan % huehner ! org \
rathann
parents: 16243
diff changeset
275 static float get_delay(void){
1107
9d764880d989 Added raw PCM writer ao driver.
atmosfear
parents:
diff changeset
276
3095
981a9e5118ce interface to libao2 changed ao_plugin added
anders
parents: 1113
diff changeset
277 return 0.0;
1107
9d764880d989 Added raw PCM writer ao driver.
atmosfear
parents:
diff changeset
278 }