annotate libao2/ao_coreaudio.c @ 32489:d5dfda231e76

Make scale filter accept all non-hardware-acceleration input formats we know a PIX_FMT_* for. It is possible we will not have a conversion for some of these formats, but since it will just fail different this approach is better since it avoids having to expand the explicit list continuously.
author reimar
date Wed, 03 Nov 2010 16:42:24 +0000
parents d9c8f66f77e1
children 8fa2f43cb760
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
29209
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
1 /*
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
2 * CoreAudio audio output driver for Mac OS X
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
3 *
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
4 * original copyright (C) Timothy J. Wood - Aug 2000
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
5 * ported to MPlayer libao2 by Dan Christiansen
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
6 *
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
7 * The S/PDIF part of the code is based on the auhal audio output
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
8 * module from VideoLAN:
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
9 * Copyright (c) 2006 Derk-Jan Hartman <hartman at videolan dot org>
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
10 *
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
11 * This file is part of MPlayer.
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
12 *
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
13 * MPlayer is free software; you can redistribute it and/or modify
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
14 * it under the terms of the GNU General Public License as published by
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
15 * the Free Software Foundation; either version 2 of the License, or
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
16 * (at your option) any later version.
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
17 *
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
18 * MPlayer is distributed in the hope that it will be useful,
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
19 * but WITHOUT ANY WARRANTY; without even the implied warranty of
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
20 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
21 * GNU General Public License for more details.
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
22 *
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
23 * You should have received a copy of the GNU General Public License along
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
24 * along with MPlayer; if not, write to the Free Software
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
25 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
26 */
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
27
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
28 /*
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
29 * The MacOS X CoreAudio framework doesn't mesh as simply as some
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
30 * simpler frameworks do. This is due to the fact that CoreAudio pulls
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
31 * audio samples rather than having them pushed at it (which is nice
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
32 * when you are wanting to do good buffering of audio).
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
33 *
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
34 * AC-3 and MPEG audio passthrough is possible, but has never been tested
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
35 * due to lack of a soundcard that supports it.
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
36 */
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
37
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
38 #include <CoreServices/CoreServices.h>
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
39 #include <AudioUnit/AudioUnit.h>
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
40 #include <AudioToolbox/AudioToolbox.h>
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
41 #include <stdio.h>
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
42 #include <string.h>
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
43 #include <stdlib.h>
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
44 #include <inttypes.h>
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
45 #include <sys/types.h>
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
46 #include <unistd.h>
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
47
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
48 #include "config.h"
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
49 #include "mp_msg.h"
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
50
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
51 #include "audio_out.h"
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
52 #include "audio_out_internal.h"
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
53 #include "libaf/af_format.h"
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
54 #include "osdep/timer.h"
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
55 #include "libavutil/fifo.h"
31649
e55ce930e6ae Refactor device selection in ao_coreaudio: Add output device selection and correctly set the default device if it's selected.
adrian
parents: 31648
diff changeset
56 #include "subopt-helper.h"
29209
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
57
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
58 static const ao_info_t info =
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
59 {
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
60 "Darwin/Mac OS X native audio output",
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
61 "coreaudio",
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
62 "Timothy J. Wood & Dan Christiansen & Chris Roccati",
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
63 ""
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
64 };
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
65
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
66 LIBAO_EXTERN(coreaudio)
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
67
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
68 /* Prefix for all mp_msg() calls */
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
69 #define ao_msg(a, b, c...) mp_msg(a, b, "AO: [coreaudio] " c)
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
70
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
71 typedef struct ao_coreaudio_s
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
72 {
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
73 AudioDeviceID i_selected_dev; /* Keeps DeviceID of the selected device. */
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
74 int b_supports_digital; /* Does the currently selected device support digital mode? */
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
75 int b_digital; /* Are we running in digital mode? */
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
76 int b_muted; /* Are we muted in digital mode? */
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
77
31647
976c9554f284 Replace deprecated functions in ao_coreaudio with their new ones introduced in OSX 10.4.
adrian
parents: 31646
diff changeset
78 AudioDeviceIOProcID renderCallback; /* Render callback used for SPDIF */
976c9554f284 Replace deprecated functions in ao_coreaudio with their new ones introduced in OSX 10.4.
adrian
parents: 31646
diff changeset
79
29209
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
80 /* AudioUnit */
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
81 AudioUnit theOutputUnit;
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
82
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
83 /* CoreAudio SPDIF mode specific */
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
84 pid_t i_hog_pid; /* Keeps the pid of our hog status. */
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
85 AudioStreamID i_stream_id; /* The StreamID that has a cac3 streamformat */
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
86 int i_stream_index; /* The index of i_stream_id in an AudioBufferList */
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
87 AudioStreamBasicDescription stream_format;/* The format we changed the stream to */
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
88 AudioStreamBasicDescription sfmt_revert; /* The original format of the stream */
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
89 int b_revert; /* Whether we need to revert the stream format */
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
90 int b_changed_mixing; /* Whether we need to set the mixing mode back */
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
91 int b_stream_format_changed; /* Flag for main thread to reset stream's format to digital and reset buffer */
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
92
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
93 /* Original common part */
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
94 int packetSize;
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
95 int paused;
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
96
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
97 /* Ring-buffer */
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
98 AVFifoBuffer *buffer;
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
99 unsigned int buffer_len; ///< must always be num_chunks * chunk_size
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
100 unsigned int num_chunks;
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
101 unsigned int chunk_size;
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
102 } ao_coreaudio_t;
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
103
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
104 static ao_coreaudio_t *ao = NULL;
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
105
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
106 /**
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
107 * \brief add data to ringbuffer
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
108 */
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
109 static int write_buffer(unsigned char* data, int len){
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
110 int free = ao->buffer_len - av_fifo_size(ao->buffer);
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
111 if (len > free) len = free;
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
112 return av_fifo_generic_write(ao->buffer, data, len, NULL);
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
113 }
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
114
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
115 /**
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
116 * \brief remove data from ringbuffer
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
117 */
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
118 static int read_buffer(unsigned char* data,int len){
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
119 int buffered = av_fifo_size(ao->buffer);
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
120 if (len > buffered) len = buffered;
29439
02dec439f717 100l, av_fifo_generic_read does not return anything useful, so ignore its
reimar
parents: 29401
diff changeset
121 av_fifo_generic_read(ao->buffer, data, len, NULL);
02dec439f717 100l, av_fifo_generic_read does not return anything useful, so ignore its
reimar
parents: 29401
diff changeset
122 return len;
29209
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
123 }
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
124
30676
13b7aa964af6 Mark theRenderProc() as static, it is only used within the file.
diego
parents: 30242
diff changeset
125 static OSStatus theRenderProc(void *inRefCon,
13b7aa964af6 Mark theRenderProc() as static, it is only used within the file.
diego
parents: 30242
diff changeset
126 AudioUnitRenderActionFlags *inActionFlags,
13b7aa964af6 Mark theRenderProc() as static, it is only used within the file.
diego
parents: 30242
diff changeset
127 const AudioTimeStamp *inTimeStamp,
13b7aa964af6 Mark theRenderProc() as static, it is only used within the file.
diego
parents: 30242
diff changeset
128 UInt32 inBusNumber, UInt32 inNumFrames,
13b7aa964af6 Mark theRenderProc() as static, it is only used within the file.
diego
parents: 30242
diff changeset
129 AudioBufferList *ioData)
29209
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
130 {
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
131 int amt=av_fifo_size(ao->buffer);
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
132 int req=(inNumFrames)*ao->packetSize;
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
133
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
134 if(amt>req)
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
135 amt=req;
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
136
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
137 if(amt)
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
138 read_buffer((unsigned char *)ioData->mBuffers[0].mData, amt);
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
139 else audio_pause();
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
140 ioData->mBuffers[0].mDataByteSize = amt;
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
141
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
142 return noErr;
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
143 }
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
144
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
145 static int control(int cmd,void *arg){
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
146 ao_control_vol_t *control_vol;
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
147 OSStatus err;
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
148 Float32 vol;
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
149 switch (cmd) {
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
150 case AOCONTROL_GET_VOLUME:
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
151 control_vol = (ao_control_vol_t*)arg;
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
152 if (ao->b_digital) {
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
153 // Digital output has no volume adjust.
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
154 return CONTROL_FALSE;
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
155 }
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
156 err = AudioUnitGetParameter(ao->theOutputUnit, kHALOutputParam_Volume, kAudioUnitScope_Global, 0, &vol);
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
157
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
158 if(err==0) {
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
159 // printf("GET VOL=%f\n", vol);
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
160 control_vol->left=control_vol->right=vol*100.0/4.0;
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
161 return CONTROL_TRUE;
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
162 }
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
163 else {
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
164 ao_msg(MSGT_AO, MSGL_WARN, "could not get HAL output volume: [%4.4s]\n", (char *)&err);
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
165 return CONTROL_FALSE;
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
166 }
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
167
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
168 case AOCONTROL_SET_VOLUME:
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
169 control_vol = (ao_control_vol_t*)arg;
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
170
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
171 if (ao->b_digital) {
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
172 // Digital output can not set volume. Here we have to return true
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
173 // to make mixer forget it. Else mixer will add a soft filter,
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
174 // that's not we expected and the filter not support ac3 stream
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
175 // will cause mplayer die.
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
176
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
177 // Although not support set volume, but at least we support mute.
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
178 // MPlayer set mute by set volume to zero, we handle it.
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
179 if (control_vol->left == 0 && control_vol->right == 0)
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
180 ao->b_muted = 1;
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
181 else
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
182 ao->b_muted = 0;
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
183 return CONTROL_TRUE;
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
184 }
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29212
diff changeset
185
29209
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
186 vol=(control_vol->left+control_vol->right)*4.0/200.0;
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
187 err = AudioUnitSetParameter(ao->theOutputUnit, kHALOutputParam_Volume, kAudioUnitScope_Global, 0, vol, 0);
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
188 if(err==0) {
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
189 // printf("SET VOL=%f\n", vol);
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
190 return CONTROL_TRUE;
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
191 }
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
192 else {
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
193 ao_msg(MSGT_AO, MSGL_WARN, "could not set HAL output volume: [%4.4s]\n", (char *)&err);
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
194 return CONTROL_FALSE;
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
195 }
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
196 /* Everything is currently unimplemented */
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
197 default:
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
198 return CONTROL_FALSE;
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
199 }
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29212
diff changeset
200
29209
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
201 }
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
202
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
203
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
204 static void print_format(int lev, const char* str, const AudioStreamBasicDescription *f){
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
205 uint32_t flags=(uint32_t) f->mFormatFlags;
31646
b0da003fadf2 Fix printf specifiers used in ao_coreaudio. Fixes warnings:
adrian
parents: 30702
diff changeset
206 ao_msg(MSGT_AO,lev, "%s %7.1fHz %"PRIu32"bit [%c%c%c%c][%"PRIu32"][%"PRIu32"][%"PRIu32"][%"PRIu32"][%"PRIu32"] %s %s %s%s%s%s\n",
29209
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
207 str, f->mSampleRate, f->mBitsPerChannel,
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
208 (int)(f->mFormatID & 0xff000000) >> 24,
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
209 (int)(f->mFormatID & 0x00ff0000) >> 16,
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
210 (int)(f->mFormatID & 0x0000ff00) >> 8,
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
211 (int)(f->mFormatID & 0x000000ff) >> 0,
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
212 f->mFormatFlags, f->mBytesPerPacket,
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
213 f->mFramesPerPacket, f->mBytesPerFrame,
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
214 f->mChannelsPerFrame,
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
215 (flags&kAudioFormatFlagIsFloat) ? "float" : "int",
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
216 (flags&kAudioFormatFlagIsBigEndian) ? "BE" : "LE",
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
217 (flags&kAudioFormatFlagIsSignedInteger) ? "S" : "U",
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
218 (flags&kAudioFormatFlagIsPacked) ? " packed" : "",
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
219 (flags&kAudioFormatFlagIsAlignedHigh) ? " aligned" : "",
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
220 (flags&kAudioFormatFlagIsNonInterleaved) ? " ni" : "" );
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
221 }
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
222
31647
976c9554f284 Replace deprecated functions in ao_coreaudio with their new ones introduced in OSX 10.4.
adrian
parents: 31646
diff changeset
223 static OSStatus GetAudioProperty(AudioObjectID id,
976c9554f284 Replace deprecated functions in ao_coreaudio with their new ones introduced in OSX 10.4.
adrian
parents: 31646
diff changeset
224 AudioObjectPropertySelector selector,
976c9554f284 Replace deprecated functions in ao_coreaudio with their new ones introduced in OSX 10.4.
adrian
parents: 31646
diff changeset
225 UInt32 outSize, void *outData)
976c9554f284 Replace deprecated functions in ao_coreaudio with their new ones introduced in OSX 10.4.
adrian
parents: 31646
diff changeset
226 {
976c9554f284 Replace deprecated functions in ao_coreaudio with their new ones introduced in OSX 10.4.
adrian
parents: 31646
diff changeset
227 AudioObjectPropertyAddress property_address;
976c9554f284 Replace deprecated functions in ao_coreaudio with their new ones introduced in OSX 10.4.
adrian
parents: 31646
diff changeset
228
976c9554f284 Replace deprecated functions in ao_coreaudio with their new ones introduced in OSX 10.4.
adrian
parents: 31646
diff changeset
229 property_address.mSelector = selector;
976c9554f284 Replace deprecated functions in ao_coreaudio with their new ones introduced in OSX 10.4.
adrian
parents: 31646
diff changeset
230 property_address.mScope = kAudioObjectPropertyScopeGlobal;
976c9554f284 Replace deprecated functions in ao_coreaudio with their new ones introduced in OSX 10.4.
adrian
parents: 31646
diff changeset
231 property_address.mElement = kAudioObjectPropertyElementMaster;
976c9554f284 Replace deprecated functions in ao_coreaudio with their new ones introduced in OSX 10.4.
adrian
parents: 31646
diff changeset
232
976c9554f284 Replace deprecated functions in ao_coreaudio with their new ones introduced in OSX 10.4.
adrian
parents: 31646
diff changeset
233 return AudioObjectGetPropertyData(id, &property_address, 0, NULL, &outSize, outData);
976c9554f284 Replace deprecated functions in ao_coreaudio with their new ones introduced in OSX 10.4.
adrian
parents: 31646
diff changeset
234 }
976c9554f284 Replace deprecated functions in ao_coreaudio with their new ones introduced in OSX 10.4.
adrian
parents: 31646
diff changeset
235
976c9554f284 Replace deprecated functions in ao_coreaudio with their new ones introduced in OSX 10.4.
adrian
parents: 31646
diff changeset
236 static UInt32 GetAudioPropertyArray(AudioObjectID id,
976c9554f284 Replace deprecated functions in ao_coreaudio with their new ones introduced in OSX 10.4.
adrian
parents: 31646
diff changeset
237 AudioObjectPropertySelector selector,
976c9554f284 Replace deprecated functions in ao_coreaudio with their new ones introduced in OSX 10.4.
adrian
parents: 31646
diff changeset
238 AudioObjectPropertyScope scope,
976c9554f284 Replace deprecated functions in ao_coreaudio with their new ones introduced in OSX 10.4.
adrian
parents: 31646
diff changeset
239 void **outData)
976c9554f284 Replace deprecated functions in ao_coreaudio with their new ones introduced in OSX 10.4.
adrian
parents: 31646
diff changeset
240 {
976c9554f284 Replace deprecated functions in ao_coreaudio with their new ones introduced in OSX 10.4.
adrian
parents: 31646
diff changeset
241 OSStatus err;
976c9554f284 Replace deprecated functions in ao_coreaudio with their new ones introduced in OSX 10.4.
adrian
parents: 31646
diff changeset
242 AudioObjectPropertyAddress property_address;
976c9554f284 Replace deprecated functions in ao_coreaudio with their new ones introduced in OSX 10.4.
adrian
parents: 31646
diff changeset
243 UInt32 i_param_size;
976c9554f284 Replace deprecated functions in ao_coreaudio with their new ones introduced in OSX 10.4.
adrian
parents: 31646
diff changeset
244
976c9554f284 Replace deprecated functions in ao_coreaudio with their new ones introduced in OSX 10.4.
adrian
parents: 31646
diff changeset
245 property_address.mSelector = selector;
976c9554f284 Replace deprecated functions in ao_coreaudio with their new ones introduced in OSX 10.4.
adrian
parents: 31646
diff changeset
246 property_address.mScope = scope;
976c9554f284 Replace deprecated functions in ao_coreaudio with their new ones introduced in OSX 10.4.
adrian
parents: 31646
diff changeset
247 property_address.mElement = kAudioObjectPropertyElementMaster;
976c9554f284 Replace deprecated functions in ao_coreaudio with their new ones introduced in OSX 10.4.
adrian
parents: 31646
diff changeset
248
976c9554f284 Replace deprecated functions in ao_coreaudio with their new ones introduced in OSX 10.4.
adrian
parents: 31646
diff changeset
249 err = AudioObjectGetPropertyDataSize(id, &property_address, 0, NULL, &i_param_size);
976c9554f284 Replace deprecated functions in ao_coreaudio with their new ones introduced in OSX 10.4.
adrian
parents: 31646
diff changeset
250
976c9554f284 Replace deprecated functions in ao_coreaudio with their new ones introduced in OSX 10.4.
adrian
parents: 31646
diff changeset
251 if (err != noErr)
976c9554f284 Replace deprecated functions in ao_coreaudio with their new ones introduced in OSX 10.4.
adrian
parents: 31646
diff changeset
252 return 0;
976c9554f284 Replace deprecated functions in ao_coreaudio with their new ones introduced in OSX 10.4.
adrian
parents: 31646
diff changeset
253
976c9554f284 Replace deprecated functions in ao_coreaudio with their new ones introduced in OSX 10.4.
adrian
parents: 31646
diff changeset
254 *outData = malloc(i_param_size);
976c9554f284 Replace deprecated functions in ao_coreaudio with their new ones introduced in OSX 10.4.
adrian
parents: 31646
diff changeset
255
976c9554f284 Replace deprecated functions in ao_coreaudio with their new ones introduced in OSX 10.4.
adrian
parents: 31646
diff changeset
256
976c9554f284 Replace deprecated functions in ao_coreaudio with their new ones introduced in OSX 10.4.
adrian
parents: 31646
diff changeset
257 err = AudioObjectGetPropertyData(id, &property_address, 0, NULL, &i_param_size, *outData);
976c9554f284 Replace deprecated functions in ao_coreaudio with their new ones introduced in OSX 10.4.
adrian
parents: 31646
diff changeset
258
976c9554f284 Replace deprecated functions in ao_coreaudio with their new ones introduced in OSX 10.4.
adrian
parents: 31646
diff changeset
259 if (err != noErr) {
976c9554f284 Replace deprecated functions in ao_coreaudio with their new ones introduced in OSX 10.4.
adrian
parents: 31646
diff changeset
260 free(*outData);
976c9554f284 Replace deprecated functions in ao_coreaudio with their new ones introduced in OSX 10.4.
adrian
parents: 31646
diff changeset
261 return 0;
976c9554f284 Replace deprecated functions in ao_coreaudio with their new ones introduced in OSX 10.4.
adrian
parents: 31646
diff changeset
262 }
976c9554f284 Replace deprecated functions in ao_coreaudio with their new ones introduced in OSX 10.4.
adrian
parents: 31646
diff changeset
263
976c9554f284 Replace deprecated functions in ao_coreaudio with their new ones introduced in OSX 10.4.
adrian
parents: 31646
diff changeset
264 return i_param_size;
976c9554f284 Replace deprecated functions in ao_coreaudio with their new ones introduced in OSX 10.4.
adrian
parents: 31646
diff changeset
265 }
976c9554f284 Replace deprecated functions in ao_coreaudio with their new ones introduced in OSX 10.4.
adrian
parents: 31646
diff changeset
266
976c9554f284 Replace deprecated functions in ao_coreaudio with their new ones introduced in OSX 10.4.
adrian
parents: 31646
diff changeset
267 static UInt32 GetGlobalAudioPropertyArray(AudioObjectID id,
976c9554f284 Replace deprecated functions in ao_coreaudio with their new ones introduced in OSX 10.4.
adrian
parents: 31646
diff changeset
268 AudioObjectPropertySelector selector,
976c9554f284 Replace deprecated functions in ao_coreaudio with their new ones introduced in OSX 10.4.
adrian
parents: 31646
diff changeset
269 void **outData)
976c9554f284 Replace deprecated functions in ao_coreaudio with their new ones introduced in OSX 10.4.
adrian
parents: 31646
diff changeset
270 {
976c9554f284 Replace deprecated functions in ao_coreaudio with their new ones introduced in OSX 10.4.
adrian
parents: 31646
diff changeset
271 return GetAudioPropertyArray(id, selector, kAudioObjectPropertyScopeGlobal, outData);
976c9554f284 Replace deprecated functions in ao_coreaudio with their new ones introduced in OSX 10.4.
adrian
parents: 31646
diff changeset
272 }
976c9554f284 Replace deprecated functions in ao_coreaudio with their new ones introduced in OSX 10.4.
adrian
parents: 31646
diff changeset
273
976c9554f284 Replace deprecated functions in ao_coreaudio with their new ones introduced in OSX 10.4.
adrian
parents: 31646
diff changeset
274 static OSStatus GetAudioPropertyString(AudioObjectID id,
976c9554f284 Replace deprecated functions in ao_coreaudio with their new ones introduced in OSX 10.4.
adrian
parents: 31646
diff changeset
275 AudioObjectPropertySelector selector,
976c9554f284 Replace deprecated functions in ao_coreaudio with their new ones introduced in OSX 10.4.
adrian
parents: 31646
diff changeset
276 char **outData)
976c9554f284 Replace deprecated functions in ao_coreaudio with their new ones introduced in OSX 10.4.
adrian
parents: 31646
diff changeset
277 {
976c9554f284 Replace deprecated functions in ao_coreaudio with their new ones introduced in OSX 10.4.
adrian
parents: 31646
diff changeset
278 OSStatus err;
976c9554f284 Replace deprecated functions in ao_coreaudio with their new ones introduced in OSX 10.4.
adrian
parents: 31646
diff changeset
279 AudioObjectPropertyAddress property_address;
976c9554f284 Replace deprecated functions in ao_coreaudio with their new ones introduced in OSX 10.4.
adrian
parents: 31646
diff changeset
280 UInt32 i_param_size;
976c9554f284 Replace deprecated functions in ao_coreaudio with their new ones introduced in OSX 10.4.
adrian
parents: 31646
diff changeset
281 CFStringRef string;
976c9554f284 Replace deprecated functions in ao_coreaudio with their new ones introduced in OSX 10.4.
adrian
parents: 31646
diff changeset
282 CFIndex string_length;
976c9554f284 Replace deprecated functions in ao_coreaudio with their new ones introduced in OSX 10.4.
adrian
parents: 31646
diff changeset
283
976c9554f284 Replace deprecated functions in ao_coreaudio with their new ones introduced in OSX 10.4.
adrian
parents: 31646
diff changeset
284 property_address.mSelector = selector;
976c9554f284 Replace deprecated functions in ao_coreaudio with their new ones introduced in OSX 10.4.
adrian
parents: 31646
diff changeset
285 property_address.mScope = kAudioObjectPropertyScopeGlobal;
976c9554f284 Replace deprecated functions in ao_coreaudio with their new ones introduced in OSX 10.4.
adrian
parents: 31646
diff changeset
286 property_address.mElement = kAudioObjectPropertyElementMaster;
976c9554f284 Replace deprecated functions in ao_coreaudio with their new ones introduced in OSX 10.4.
adrian
parents: 31646
diff changeset
287
976c9554f284 Replace deprecated functions in ao_coreaudio with their new ones introduced in OSX 10.4.
adrian
parents: 31646
diff changeset
288 i_param_size = sizeof(CFStringRef);
976c9554f284 Replace deprecated functions in ao_coreaudio with their new ones introduced in OSX 10.4.
adrian
parents: 31646
diff changeset
289 err = AudioObjectGetPropertyData(id, &property_address, 0, NULL, &i_param_size, &string);
976c9554f284 Replace deprecated functions in ao_coreaudio with their new ones introduced in OSX 10.4.
adrian
parents: 31646
diff changeset
290 if (err != noErr)
976c9554f284 Replace deprecated functions in ao_coreaudio with their new ones introduced in OSX 10.4.
adrian
parents: 31646
diff changeset
291 return err;
976c9554f284 Replace deprecated functions in ao_coreaudio with their new ones introduced in OSX 10.4.
adrian
parents: 31646
diff changeset
292
976c9554f284 Replace deprecated functions in ao_coreaudio with their new ones introduced in OSX 10.4.
adrian
parents: 31646
diff changeset
293 string_length = CFStringGetMaximumSizeForEncoding(CFStringGetLength(string),
976c9554f284 Replace deprecated functions in ao_coreaudio with their new ones introduced in OSX 10.4.
adrian
parents: 31646
diff changeset
294 kCFStringEncodingASCII);
976c9554f284 Replace deprecated functions in ao_coreaudio with their new ones introduced in OSX 10.4.
adrian
parents: 31646
diff changeset
295 *outData = malloc(string_length + 1);
976c9554f284 Replace deprecated functions in ao_coreaudio with their new ones introduced in OSX 10.4.
adrian
parents: 31646
diff changeset
296 CFStringGetCString(string, *outData, string_length + 1, kCFStringEncodingASCII);
976c9554f284 Replace deprecated functions in ao_coreaudio with their new ones introduced in OSX 10.4.
adrian
parents: 31646
diff changeset
297
976c9554f284 Replace deprecated functions in ao_coreaudio with their new ones introduced in OSX 10.4.
adrian
parents: 31646
diff changeset
298 CFRelease(string);
976c9554f284 Replace deprecated functions in ao_coreaudio with their new ones introduced in OSX 10.4.
adrian
parents: 31646
diff changeset
299
976c9554f284 Replace deprecated functions in ao_coreaudio with their new ones introduced in OSX 10.4.
adrian
parents: 31646
diff changeset
300 return err;
976c9554f284 Replace deprecated functions in ao_coreaudio with their new ones introduced in OSX 10.4.
adrian
parents: 31646
diff changeset
301 }
976c9554f284 Replace deprecated functions in ao_coreaudio with their new ones introduced in OSX 10.4.
adrian
parents: 31646
diff changeset
302
976c9554f284 Replace deprecated functions in ao_coreaudio with their new ones introduced in OSX 10.4.
adrian
parents: 31646
diff changeset
303 static OSStatus SetAudioProperty(AudioObjectID id,
976c9554f284 Replace deprecated functions in ao_coreaudio with their new ones introduced in OSX 10.4.
adrian
parents: 31646
diff changeset
304 AudioObjectPropertySelector selector,
976c9554f284 Replace deprecated functions in ao_coreaudio with their new ones introduced in OSX 10.4.
adrian
parents: 31646
diff changeset
305 UInt32 inDataSize, void *inData)
976c9554f284 Replace deprecated functions in ao_coreaudio with their new ones introduced in OSX 10.4.
adrian
parents: 31646
diff changeset
306 {
976c9554f284 Replace deprecated functions in ao_coreaudio with their new ones introduced in OSX 10.4.
adrian
parents: 31646
diff changeset
307 AudioObjectPropertyAddress property_address;
976c9554f284 Replace deprecated functions in ao_coreaudio with their new ones introduced in OSX 10.4.
adrian
parents: 31646
diff changeset
308
976c9554f284 Replace deprecated functions in ao_coreaudio with their new ones introduced in OSX 10.4.
adrian
parents: 31646
diff changeset
309 property_address.mSelector = selector;
976c9554f284 Replace deprecated functions in ao_coreaudio with their new ones introduced in OSX 10.4.
adrian
parents: 31646
diff changeset
310 property_address.mScope = kAudioObjectPropertyScopeGlobal;
976c9554f284 Replace deprecated functions in ao_coreaudio with their new ones introduced in OSX 10.4.
adrian
parents: 31646
diff changeset
311 property_address.mElement = kAudioObjectPropertyElementMaster;
976c9554f284 Replace deprecated functions in ao_coreaudio with their new ones introduced in OSX 10.4.
adrian
parents: 31646
diff changeset
312
976c9554f284 Replace deprecated functions in ao_coreaudio with their new ones introduced in OSX 10.4.
adrian
parents: 31646
diff changeset
313 return AudioObjectSetPropertyData(id, &property_address, 0, NULL, inDataSize, inData);
976c9554f284 Replace deprecated functions in ao_coreaudio with their new ones introduced in OSX 10.4.
adrian
parents: 31646
diff changeset
314 }
976c9554f284 Replace deprecated functions in ao_coreaudio with their new ones introduced in OSX 10.4.
adrian
parents: 31646
diff changeset
315
976c9554f284 Replace deprecated functions in ao_coreaudio with their new ones introduced in OSX 10.4.
adrian
parents: 31646
diff changeset
316 static Boolean IsAudioPropertySettable(AudioObjectID id,
976c9554f284 Replace deprecated functions in ao_coreaudio with their new ones introduced in OSX 10.4.
adrian
parents: 31646
diff changeset
317 AudioObjectPropertySelector selector,
976c9554f284 Replace deprecated functions in ao_coreaudio with their new ones introduced in OSX 10.4.
adrian
parents: 31646
diff changeset
318 Boolean *outData)
976c9554f284 Replace deprecated functions in ao_coreaudio with their new ones introduced in OSX 10.4.
adrian
parents: 31646
diff changeset
319 {
976c9554f284 Replace deprecated functions in ao_coreaudio with their new ones introduced in OSX 10.4.
adrian
parents: 31646
diff changeset
320 AudioObjectPropertyAddress property_address;
976c9554f284 Replace deprecated functions in ao_coreaudio with their new ones introduced in OSX 10.4.
adrian
parents: 31646
diff changeset
321
976c9554f284 Replace deprecated functions in ao_coreaudio with their new ones introduced in OSX 10.4.
adrian
parents: 31646
diff changeset
322 property_address.mSelector = selector;
976c9554f284 Replace deprecated functions in ao_coreaudio with their new ones introduced in OSX 10.4.
adrian
parents: 31646
diff changeset
323 property_address.mScope = kAudioObjectPropertyScopeGlobal;
976c9554f284 Replace deprecated functions in ao_coreaudio with their new ones introduced in OSX 10.4.
adrian
parents: 31646
diff changeset
324 property_address.mElement = kAudioObjectPropertyElementMaster;
976c9554f284 Replace deprecated functions in ao_coreaudio with their new ones introduced in OSX 10.4.
adrian
parents: 31646
diff changeset
325
976c9554f284 Replace deprecated functions in ao_coreaudio with their new ones introduced in OSX 10.4.
adrian
parents: 31646
diff changeset
326 return AudioObjectIsPropertySettable(id, &property_address, outData);
976c9554f284 Replace deprecated functions in ao_coreaudio with their new ones introduced in OSX 10.4.
adrian
parents: 31646
diff changeset
327 }
29209
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
328
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
329 static int AudioDeviceSupportsDigital( AudioDeviceID i_dev_id );
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
330 static int AudioStreamSupportsDigital( AudioStreamID i_stream_id );
29212
eda346733b8c Add missing 'void' to parameterless function declarations.
diego
parents: 29209
diff changeset
331 static int OpenSPDIF(void);
29209
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
332 static int AudioStreamChangeFormat( AudioStreamID i_stream_id, AudioStreamBasicDescription change_format );
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
333 static OSStatus RenderCallbackSPDIF( AudioDeviceID inDevice,
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
334 const AudioTimeStamp * inNow,
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
335 const void * inInputData,
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
336 const AudioTimeStamp * inInputTime,
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
337 AudioBufferList * outOutputData,
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
338 const AudioTimeStamp * inOutputTime,
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
339 void * threadGlobals );
31647
976c9554f284 Replace deprecated functions in ao_coreaudio with their new ones introduced in OSX 10.4.
adrian
parents: 31646
diff changeset
340 static OSStatus StreamListener( AudioObjectID inObjectID,
976c9554f284 Replace deprecated functions in ao_coreaudio with their new ones introduced in OSX 10.4.
adrian
parents: 31646
diff changeset
341 UInt32 inNumberAddresses,
976c9554f284 Replace deprecated functions in ao_coreaudio with their new ones introduced in OSX 10.4.
adrian
parents: 31646
diff changeset
342 const AudioObjectPropertyAddress inAddresses[],
976c9554f284 Replace deprecated functions in ao_coreaudio with their new ones introduced in OSX 10.4.
adrian
parents: 31646
diff changeset
343 void *inClientData );
976c9554f284 Replace deprecated functions in ao_coreaudio with their new ones introduced in OSX 10.4.
adrian
parents: 31646
diff changeset
344 static OSStatus DeviceListener( AudioObjectID inObjectID,
976c9554f284 Replace deprecated functions in ao_coreaudio with their new ones introduced in OSX 10.4.
adrian
parents: 31646
diff changeset
345 UInt32 inNumberAddresses,
976c9554f284 Replace deprecated functions in ao_coreaudio with their new ones introduced in OSX 10.4.
adrian
parents: 31646
diff changeset
346 const AudioObjectPropertyAddress inAddresses[],
976c9554f284 Replace deprecated functions in ao_coreaudio with their new ones introduced in OSX 10.4.
adrian
parents: 31646
diff changeset
347 void *inClientData );
29209
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
348
31649
e55ce930e6ae Refactor device selection in ao_coreaudio: Add output device selection and correctly set the default device if it's selected.
adrian
parents: 31648
diff changeset
349 static void print_help(void)
e55ce930e6ae Refactor device selection in ao_coreaudio: Add output device selection and correctly set the default device if it's selected.
adrian
parents: 31648
diff changeset
350 {
e55ce930e6ae Refactor device selection in ao_coreaudio: Add output device selection and correctly set the default device if it's selected.
adrian
parents: 31648
diff changeset
351 OSStatus err;
e55ce930e6ae Refactor device selection in ao_coreaudio: Add output device selection and correctly set the default device if it's selected.
adrian
parents: 31648
diff changeset
352 UInt32 i_param_size;
e55ce930e6ae Refactor device selection in ao_coreaudio: Add output device selection and correctly set the default device if it's selected.
adrian
parents: 31648
diff changeset
353 int num_devices;
e55ce930e6ae Refactor device selection in ao_coreaudio: Add output device selection and correctly set the default device if it's selected.
adrian
parents: 31648
diff changeset
354 AudioDeviceID *devids;
e55ce930e6ae Refactor device selection in ao_coreaudio: Add output device selection and correctly set the default device if it's selected.
adrian
parents: 31648
diff changeset
355 char *device_name;
e55ce930e6ae Refactor device selection in ao_coreaudio: Add output device selection and correctly set the default device if it's selected.
adrian
parents: 31648
diff changeset
356
e55ce930e6ae Refactor device selection in ao_coreaudio: Add output device selection and correctly set the default device if it's selected.
adrian
parents: 31648
diff changeset
357 mp_msg(MSGT_AO, MSGL_FATAL,
e55ce930e6ae Refactor device selection in ao_coreaudio: Add output device selection and correctly set the default device if it's selected.
adrian
parents: 31648
diff changeset
358 "\n-ao coreaudio commandline help:\n"
e55ce930e6ae Refactor device selection in ao_coreaudio: Add output device selection and correctly set the default device if it's selected.
adrian
parents: 31648
diff changeset
359 "Example: mplayer -ao coreaudio:device_id=266\n"
e55ce930e6ae Refactor device selection in ao_coreaudio: Add output device selection and correctly set the default device if it's selected.
adrian
parents: 31648
diff changeset
360 " open Core Audio with output device ID 266.\n"
e55ce930e6ae Refactor device selection in ao_coreaudio: Add output device selection and correctly set the default device if it's selected.
adrian
parents: 31648
diff changeset
361 "\nOptions:\n"
e55ce930e6ae Refactor device selection in ao_coreaudio: Add output device selection and correctly set the default device if it's selected.
adrian
parents: 31648
diff changeset
362 " device_id\n"
e55ce930e6ae Refactor device selection in ao_coreaudio: Add output device selection and correctly set the default device if it's selected.
adrian
parents: 31648
diff changeset
363 " ID of output device to use (0 = default device)\n"
e55ce930e6ae Refactor device selection in ao_coreaudio: Add output device selection and correctly set the default device if it's selected.
adrian
parents: 31648
diff changeset
364 " help\n"
e55ce930e6ae Refactor device selection in ao_coreaudio: Add output device selection and correctly set the default device if it's selected.
adrian
parents: 31648
diff changeset
365 " This help including list of available devices.\n"
e55ce930e6ae Refactor device selection in ao_coreaudio: Add output device selection and correctly set the default device if it's selected.
adrian
parents: 31648
diff changeset
366 "\n"
e55ce930e6ae Refactor device selection in ao_coreaudio: Add output device selection and correctly set the default device if it's selected.
adrian
parents: 31648
diff changeset
367 "Available output devices:\n");
e55ce930e6ae Refactor device selection in ao_coreaudio: Add output device selection and correctly set the default device if it's selected.
adrian
parents: 31648
diff changeset
368
e55ce930e6ae Refactor device selection in ao_coreaudio: Add output device selection and correctly set the default device if it's selected.
adrian
parents: 31648
diff changeset
369 i_param_size = GetGlobalAudioPropertyArray(kAudioObjectSystemObject, kAudioHardwarePropertyDevices, (void **)&devids);
e55ce930e6ae Refactor device selection in ao_coreaudio: Add output device selection and correctly set the default device if it's selected.
adrian
parents: 31648
diff changeset
370
e55ce930e6ae Refactor device selection in ao_coreaudio: Add output device selection and correctly set the default device if it's selected.
adrian
parents: 31648
diff changeset
371 if (!i_param_size) {
e55ce930e6ae Refactor device selection in ao_coreaudio: Add output device selection and correctly set the default device if it's selected.
adrian
parents: 31648
diff changeset
372 mp_msg(MSGT_AO, MSGL_FATAL, "Failed to get list of output devices.\n");
e55ce930e6ae Refactor device selection in ao_coreaudio: Add output device selection and correctly set the default device if it's selected.
adrian
parents: 31648
diff changeset
373 return;
e55ce930e6ae Refactor device selection in ao_coreaudio: Add output device selection and correctly set the default device if it's selected.
adrian
parents: 31648
diff changeset
374 }
e55ce930e6ae Refactor device selection in ao_coreaudio: Add output device selection and correctly set the default device if it's selected.
adrian
parents: 31648
diff changeset
375
e55ce930e6ae Refactor device selection in ao_coreaudio: Add output device selection and correctly set the default device if it's selected.
adrian
parents: 31648
diff changeset
376 num_devices = i_param_size / sizeof(AudioDeviceID);
e55ce930e6ae Refactor device selection in ao_coreaudio: Add output device selection and correctly set the default device if it's selected.
adrian
parents: 31648
diff changeset
377
e55ce930e6ae Refactor device selection in ao_coreaudio: Add output device selection and correctly set the default device if it's selected.
adrian
parents: 31648
diff changeset
378 for (int i = 0; i < num_devices; ++i) {
e55ce930e6ae Refactor device selection in ao_coreaudio: Add output device selection and correctly set the default device if it's selected.
adrian
parents: 31648
diff changeset
379 err = GetAudioPropertyString(devids[i], kAudioObjectPropertyName, &device_name);
e55ce930e6ae Refactor device selection in ao_coreaudio: Add output device selection and correctly set the default device if it's selected.
adrian
parents: 31648
diff changeset
380
e55ce930e6ae Refactor device selection in ao_coreaudio: Add output device selection and correctly set the default device if it's selected.
adrian
parents: 31648
diff changeset
381 if (err == noErr) {
e55ce930e6ae Refactor device selection in ao_coreaudio: Add output device selection and correctly set the default device if it's selected.
adrian
parents: 31648
diff changeset
382 mp_msg(MSGT_AO, MSGL_FATAL, "%s (id: %"PRIu32")\n", device_name, devids[i]);
e55ce930e6ae Refactor device selection in ao_coreaudio: Add output device selection and correctly set the default device if it's selected.
adrian
parents: 31648
diff changeset
383 free(device_name);
e55ce930e6ae Refactor device selection in ao_coreaudio: Add output device selection and correctly set the default device if it's selected.
adrian
parents: 31648
diff changeset
384 } else
e55ce930e6ae Refactor device selection in ao_coreaudio: Add output device selection and correctly set the default device if it's selected.
adrian
parents: 31648
diff changeset
385 mp_msg(MSGT_AO, MSGL_FATAL, "Unknown (id: %"PRIu32")\n", devids[i]);
e55ce930e6ae Refactor device selection in ao_coreaudio: Add output device selection and correctly set the default device if it's selected.
adrian
parents: 31648
diff changeset
386 }
e55ce930e6ae Refactor device selection in ao_coreaudio: Add output device selection and correctly set the default device if it's selected.
adrian
parents: 31648
diff changeset
387
e55ce930e6ae Refactor device selection in ao_coreaudio: Add output device selection and correctly set the default device if it's selected.
adrian
parents: 31648
diff changeset
388 mp_msg(MSGT_AO, MSGL_FATAL, "\n");
e55ce930e6ae Refactor device selection in ao_coreaudio: Add output device selection and correctly set the default device if it's selected.
adrian
parents: 31648
diff changeset
389
e55ce930e6ae Refactor device selection in ao_coreaudio: Add output device selection and correctly set the default device if it's selected.
adrian
parents: 31648
diff changeset
390 free(devids);
e55ce930e6ae Refactor device selection in ao_coreaudio: Add output device selection and correctly set the default device if it's selected.
adrian
parents: 31648
diff changeset
391 }
e55ce930e6ae Refactor device selection in ao_coreaudio: Add output device selection and correctly set the default device if it's selected.
adrian
parents: 31648
diff changeset
392
29209
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
393 static int init(int rate,int channels,int format,int flags)
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
394 {
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
395 AudioStreamBasicDescription inDesc;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29212
diff changeset
396 ComponentDescription desc;
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29212
diff changeset
397 Component comp;
29209
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
398 AURenderCallbackStruct renderCallback;
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
399 OSStatus err;
31657
fa6671a1b8dc Remove some unused variables along with the corresponding warnings.
diego
parents: 31651
diff changeset
400 UInt32 size, maxFrames, b_alive;
29209
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
401 char *psz_name;
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
402 AudioDeviceID devid_def = 0;
31659
a05f97bad2a9 Improve handling of the "help" suboption in coreaudio:
adrian
parents: 31657
diff changeset
403 int device_id, display_help = 0;
31649
e55ce930e6ae Refactor device selection in ao_coreaudio: Add output device selection and correctly set the default device if it's selected.
adrian
parents: 31648
diff changeset
404
e55ce930e6ae Refactor device selection in ao_coreaudio: Add output device selection and correctly set the default device if it's selected.
adrian
parents: 31648
diff changeset
405 const opt_t subopts[] = {
31660
5fd00f0e4d1c Reindent and align after r31725.
adrian
parents: 31659
diff changeset
406 {"device_id", OPT_ARG_INT, &device_id, NULL},
5fd00f0e4d1c Reindent and align after r31725.
adrian
parents: 31659
diff changeset
407 {"help", OPT_ARG_BOOL, &display_help, NULL},
31649
e55ce930e6ae Refactor device selection in ao_coreaudio: Add output device selection and correctly set the default device if it's selected.
adrian
parents: 31648
diff changeset
408 {NULL}
e55ce930e6ae Refactor device selection in ao_coreaudio: Add output device selection and correctly set the default device if it's selected.
adrian
parents: 31648
diff changeset
409 };
e55ce930e6ae Refactor device selection in ao_coreaudio: Add output device selection and correctly set the default device if it's selected.
adrian
parents: 31648
diff changeset
410
e55ce930e6ae Refactor device selection in ao_coreaudio: Add output device selection and correctly set the default device if it's selected.
adrian
parents: 31648
diff changeset
411 // set defaults
e55ce930e6ae Refactor device selection in ao_coreaudio: Add output device selection and correctly set the default device if it's selected.
adrian
parents: 31648
diff changeset
412 device_id = 0;
e55ce930e6ae Refactor device selection in ao_coreaudio: Add output device selection and correctly set the default device if it's selected.
adrian
parents: 31648
diff changeset
413
31659
a05f97bad2a9 Improve handling of the "help" suboption in coreaudio:
adrian
parents: 31657
diff changeset
414 if (subopt_parse(ao_subdevice, subopts) != 0 || display_help) {
31649
e55ce930e6ae Refactor device selection in ao_coreaudio: Add output device selection and correctly set the default device if it's selected.
adrian
parents: 31648
diff changeset
415 print_help();
31659
a05f97bad2a9 Improve handling of the "help" suboption in coreaudio:
adrian
parents: 31657
diff changeset
416 if (!display_help)
31660
5fd00f0e4d1c Reindent and align after r31725.
adrian
parents: 31659
diff changeset
417 return 0;
31649
e55ce930e6ae Refactor device selection in ao_coreaudio: Add output device selection and correctly set the default device if it's selected.
adrian
parents: 31648
diff changeset
418 }
29209
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
419
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
420 ao_msg(MSGT_AO,MSGL_V, "init([%dHz][%dch][%s][%d])\n", rate, channels, af_fmt2str_short(format), flags);
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
421
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
422 ao = calloc(1, sizeof(ao_coreaudio_t));
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
423
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
424 ao->i_selected_dev = 0;
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
425 ao->b_supports_digital = 0;
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
426 ao->b_digital = 0;
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
427 ao->b_muted = 0;
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
428 ao->b_stream_format_changed = 0;
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
429 ao->i_hog_pid = -1;
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
430 ao->i_stream_id = 0;
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
431 ao->i_stream_index = -1;
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
432 ao->b_revert = 0;
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
433 ao->b_changed_mixing = 0;
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
434
31649
e55ce930e6ae Refactor device selection in ao_coreaudio: Add output device selection and correctly set the default device if it's selected.
adrian
parents: 31648
diff changeset
435 if (device_id == 0) {
29209
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
436 /* Find the ID of the default Device. */
31647
976c9554f284 Replace deprecated functions in ao_coreaudio with their new ones introduced in OSX 10.4.
adrian
parents: 31646
diff changeset
437 err = GetAudioProperty(kAudioObjectSystemObject,
976c9554f284 Replace deprecated functions in ao_coreaudio with their new ones introduced in OSX 10.4.
adrian
parents: 31646
diff changeset
438 kAudioHardwarePropertyDefaultOutputDevice,
976c9554f284 Replace deprecated functions in ao_coreaudio with their new ones introduced in OSX 10.4.
adrian
parents: 31646
diff changeset
439 sizeof(UInt32), &devid_def);
29209
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
440 if (err != noErr)
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
441 {
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
442 ao_msg(MSGT_AO, MSGL_WARN, "could not get default audio device: [%4.4s]\n", (char *)&err);
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
443 goto err_out;
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
444 }
31649
e55ce930e6ae Refactor device selection in ao_coreaudio: Add output device selection and correctly set the default device if it's selected.
adrian
parents: 31648
diff changeset
445 } else {
e55ce930e6ae Refactor device selection in ao_coreaudio: Add output device selection and correctly set the default device if it's selected.
adrian
parents: 31648
diff changeset
446 devid_def = device_id;
e55ce930e6ae Refactor device selection in ao_coreaudio: Add output device selection and correctly set the default device if it's selected.
adrian
parents: 31648
diff changeset
447 }
29209
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
448
31650
955cdbd3ac02 Fix cosmetics after r31715.
adrian
parents: 31649
diff changeset
449 /* Retrieve the name of the device. */
955cdbd3ac02 Fix cosmetics after r31715.
adrian
parents: 31649
diff changeset
450 err = GetAudioPropertyString(devid_def,
955cdbd3ac02 Fix cosmetics after r31715.
adrian
parents: 31649
diff changeset
451 kAudioObjectPropertyName,
955cdbd3ac02 Fix cosmetics after r31715.
adrian
parents: 31649
diff changeset
452 &psz_name);
955cdbd3ac02 Fix cosmetics after r31715.
adrian
parents: 31649
diff changeset
453 if (err != noErr)
955cdbd3ac02 Fix cosmetics after r31715.
adrian
parents: 31649
diff changeset
454 {
955cdbd3ac02 Fix cosmetics after r31715.
adrian
parents: 31649
diff changeset
455 ao_msg(MSGT_AO, MSGL_WARN, "could not get default audio device name: [%4.4s]\n", (char *)&err);
955cdbd3ac02 Fix cosmetics after r31715.
adrian
parents: 31649
diff changeset
456 goto err_out;
955cdbd3ac02 Fix cosmetics after r31715.
adrian
parents: 31649
diff changeset
457 }
29209
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
458
31649
e55ce930e6ae Refactor device selection in ao_coreaudio: Add output device selection and correctly set the default device if it's selected.
adrian
parents: 31648
diff changeset
459 ao_msg(MSGT_AO,MSGL_V, "got audio output device ID: %"PRIu32" Name: %s\n", devid_def, psz_name );
29209
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
460
31649
e55ce930e6ae Refactor device selection in ao_coreaudio: Add output device selection and correctly set the default device if it's selected.
adrian
parents: 31648
diff changeset
461 /* Probe whether device support S/PDIF stream output if input is AC3 stream. */
e55ce930e6ae Refactor device selection in ao_coreaudio: Add output device selection and correctly set the default device if it's selected.
adrian
parents: 31648
diff changeset
462 if (AF_FORMAT_IS_AC3(format)) {
29209
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
463 if (AudioDeviceSupportsDigital(devid_def))
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
464 {
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
465 ao->b_supports_digital = 1;
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
466 }
31891
4f17ff5b3cbc Fix a bunch of grammar and spelling errors in mp_msg calls.
diego
parents: 31660
diff changeset
467 ao_msg(MSGT_AO, MSGL_V,
4f17ff5b3cbc Fix a bunch of grammar and spelling errors in mp_msg calls.
diego
parents: 31660
diff changeset
468 "probe default audio output device about support for digital s/pdif output: %d\n",
4f17ff5b3cbc Fix a bunch of grammar and spelling errors in mp_msg calls.
diego
parents: 31660
diff changeset
469 ao->b_supports_digital );
31649
e55ce930e6ae Refactor device selection in ao_coreaudio: Add output device selection and correctly set the default device if it's selected.
adrian
parents: 31648
diff changeset
470 }
29209
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
471
31649
e55ce930e6ae Refactor device selection in ao_coreaudio: Add output device selection and correctly set the default device if it's selected.
adrian
parents: 31648
diff changeset
472 free(psz_name);
e55ce930e6ae Refactor device selection in ao_coreaudio: Add output device selection and correctly set the default device if it's selected.
adrian
parents: 31648
diff changeset
473
e55ce930e6ae Refactor device selection in ao_coreaudio: Add output device selection and correctly set the default device if it's selected.
adrian
parents: 31648
diff changeset
474 // Save selected device id
e55ce930e6ae Refactor device selection in ao_coreaudio: Add output device selection and correctly set the default device if it's selected.
adrian
parents: 31648
diff changeset
475 ao->i_selected_dev = devid_def;
29209
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
476
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
477 // Build Description for the input format
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
478 inDesc.mSampleRate=rate;
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
479 inDesc.mFormatID=ao->b_supports_digital ? kAudioFormat60958AC3 : kAudioFormatLinearPCM;
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
480 inDesc.mChannelsPerFrame=channels;
30235
53c43f683cd7 Use af_fmt2bits instead of reimplementing it.
reimar
parents: 30234
diff changeset
481 inDesc.mBitsPerChannel=af_fmt2bits(format);
29209
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
482
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
483 if((format&AF_FORMAT_POINT_MASK)==AF_FORMAT_F) {
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
484 // float
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
485 inDesc.mFormatFlags = kAudioFormatFlagIsFloat|kAudioFormatFlagIsPacked;
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
486 }
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
487 else if((format&AF_FORMAT_SIGN_MASK)==AF_FORMAT_SI) {
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
488 // signed int
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
489 inDesc.mFormatFlags = kAudioFormatFlagIsSignedInteger|kAudioFormatFlagIsPacked;
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
490 }
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
491 else {
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
492 // unsigned int
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
493 inDesc.mFormatFlags = kAudioFormatFlagIsPacked;
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
494 }
30242
03c1ad03f29d MPlayer's format now correctly identifies AC3 as either little- or big-endian,
reimar
parents: 30235
diff changeset
495 if ((format & AF_FORMAT_END_MASK) == AF_FORMAT_BE)
29209
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
496 inDesc.mFormatFlags |= kAudioFormatFlagIsBigEndian;
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
497
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
498 inDesc.mFramesPerPacket = 1;
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
499 ao->packetSize = inDesc.mBytesPerPacket = inDesc.mBytesPerFrame = inDesc.mFramesPerPacket*channels*(inDesc.mBitsPerChannel/8);
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
500 print_format(MSGL_V, "source:",&inDesc);
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
501
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
502 if (ao->b_supports_digital)
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
503 {
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
504 b_alive = 1;
31647
976c9554f284 Replace deprecated functions in ao_coreaudio with their new ones introduced in OSX 10.4.
adrian
parents: 31646
diff changeset
505 err = GetAudioProperty(ao->i_selected_dev,
976c9554f284 Replace deprecated functions in ao_coreaudio with their new ones introduced in OSX 10.4.
adrian
parents: 31646
diff changeset
506 kAudioDevicePropertyDeviceIsAlive,
976c9554f284 Replace deprecated functions in ao_coreaudio with their new ones introduced in OSX 10.4.
adrian
parents: 31646
diff changeset
507 sizeof(UInt32), &b_alive);
29209
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
508 if (err != noErr)
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
509 ao_msg(MSGT_AO, MSGL_WARN, "could not check whether device is alive: [%4.4s]\n", (char *)&err);
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
510 if (!b_alive)
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
511 ao_msg(MSGT_AO, MSGL_WARN, "device is not alive\n" );
31650
955cdbd3ac02 Fix cosmetics after r31715.
adrian
parents: 31649
diff changeset
512
29209
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
513 /* S/PDIF output need device in HogMode. */
31647
976c9554f284 Replace deprecated functions in ao_coreaudio with their new ones introduced in OSX 10.4.
adrian
parents: 31646
diff changeset
514 err = GetAudioProperty(ao->i_selected_dev,
976c9554f284 Replace deprecated functions in ao_coreaudio with their new ones introduced in OSX 10.4.
adrian
parents: 31646
diff changeset
515 kAudioDevicePropertyHogMode,
976c9554f284 Replace deprecated functions in ao_coreaudio with their new ones introduced in OSX 10.4.
adrian
parents: 31646
diff changeset
516 sizeof(pid_t), &ao->i_hog_pid);
29209
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
517 if (err != noErr)
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
518 {
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
519 /* This is not a fatal error. Some drivers simply don't support this property. */
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
520 ao_msg(MSGT_AO, MSGL_WARN, "could not check whether device is hogged: [%4.4s]\n",
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
521 (char *)&err);
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
522 ao->i_hog_pid = -1;
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
523 }
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
524
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
525 if (ao->i_hog_pid != -1 && ao->i_hog_pid != getpid())
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
526 {
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
527 ao_msg(MSGT_AO, MSGL_WARN, "Selected audio device is exclusively in use by another program.\n" );
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
528 goto err_out;
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
529 }
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
530 ao->stream_format = inDesc;
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
531 return OpenSPDIF();
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
532 }
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
533
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
534 /* original analog output code */
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
535 desc.componentType = kAudioUnitType_Output;
31649
e55ce930e6ae Refactor device selection in ao_coreaudio: Add output device selection and correctly set the default device if it's selected.
adrian
parents: 31648
diff changeset
536 desc.componentSubType = (device_id == 0) ? kAudioUnitSubType_DefaultOutput : kAudioUnitSubType_HALOutput;
29209
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
537 desc.componentManufacturer = kAudioUnitManufacturer_Apple;
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
538 desc.componentFlags = 0;
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
539 desc.componentFlagsMask = 0;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29212
diff changeset
540
29209
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
541 comp = FindNextComponent(NULL, &desc); //Finds an component that meets the desc spec's
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
542 if (comp == NULL) {
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
543 ao_msg(MSGT_AO, MSGL_WARN, "Unable to find Output Unit component\n");
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
544 goto err_out;
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
545 }
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29212
diff changeset
546
29209
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
547 err = OpenAComponent(comp, &(ao->theOutputUnit)); //gains access to the services provided by the component
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
548 if (err) {
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
549 ao_msg(MSGT_AO, MSGL_WARN, "Unable to open Output Unit component: [%4.4s]\n", (char *)&err);
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
550 goto err_out;
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
551 }
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
552
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29212
diff changeset
553 // Initialize AudioUnit
29209
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
554 err = AudioUnitInitialize(ao->theOutputUnit);
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
555 if (err) {
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
556 ao_msg(MSGT_AO, MSGL_WARN, "Unable to initialize Output Unit component: [%4.4s]\n", (char *)&err);
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
557 goto err_out1;
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
558 }
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
559
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
560 size = sizeof(AudioStreamBasicDescription);
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
561 err = AudioUnitSetProperty(ao->theOutputUnit, kAudioUnitProperty_StreamFormat, kAudioUnitScope_Input, 0, &inDesc, size);
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
562
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
563 if (err) {
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
564 ao_msg(MSGT_AO, MSGL_WARN, "Unable to set the input format: [%4.4s]\n", (char *)&err);
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
565 goto err_out2;
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
566 }
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
567
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
568 size = sizeof(UInt32);
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
569 err = AudioUnitGetProperty(ao->theOutputUnit, kAudioDevicePropertyBufferSize, kAudioUnitScope_Input, 0, &maxFrames, &size);
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29212
diff changeset
570
29209
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
571 if (err)
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
572 {
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
573 ao_msg(MSGT_AO,MSGL_WARN, "AudioUnitGetProperty returned [%4.4s] when getting kAudioDevicePropertyBufferSize\n", (char *)&err);
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
574 goto err_out2;
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
575 }
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
576
31649
e55ce930e6ae Refactor device selection in ao_coreaudio: Add output device selection and correctly set the default device if it's selected.
adrian
parents: 31648
diff changeset
577 //Set the Current Device to the Default Output Unit.
e55ce930e6ae Refactor device selection in ao_coreaudio: Add output device selection and correctly set the default device if it's selected.
adrian
parents: 31648
diff changeset
578 err = AudioUnitSetProperty(ao->theOutputUnit, kAudioOutputUnitProperty_CurrentDevice, kAudioUnitScope_Global, 0, &ao->i_selected_dev, sizeof(ao->i_selected_dev));
e55ce930e6ae Refactor device selection in ao_coreaudio: Add output device selection and correctly set the default device if it's selected.
adrian
parents: 31648
diff changeset
579
29209
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
580 ao->chunk_size = maxFrames;//*inDesc.mBytesPerFrame;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29212
diff changeset
581
29209
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
582 ao_data.samplerate = inDesc.mSampleRate;
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
583 ao_data.channels = inDesc.mChannelsPerFrame;
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
584 ao_data.bps = ao_data.samplerate * inDesc.mBytesPerFrame;
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
585 ao_data.outburst = ao->chunk_size;
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
586 ao_data.buffersize = ao_data.bps;
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
587
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
588 ao->num_chunks = (ao_data.bps+ao->chunk_size-1)/ao->chunk_size;
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
589 ao->buffer_len = ao->num_chunks * ao->chunk_size;
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
590 ao->buffer = av_fifo_alloc(ao->buffer_len);
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29212
diff changeset
591
29209
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
592 ao_msg(MSGT_AO,MSGL_V, "using %5d chunks of %d bytes (buffer len %d bytes)\n", (int)ao->num_chunks, (int)ao->chunk_size, (int)ao->buffer_len);
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
593
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
594 renderCallback.inputProc = theRenderProc;
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
595 renderCallback.inputProcRefCon = 0;
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
596 err = AudioUnitSetProperty(ao->theOutputUnit, kAudioUnitProperty_SetRenderCallback, kAudioUnitScope_Input, 0, &renderCallback, sizeof(AURenderCallbackStruct));
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
597 if (err) {
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
598 ao_msg(MSGT_AO, MSGL_WARN, "Unable to set the render callback: [%4.4s]\n", (char *)&err);
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
599 goto err_out2;
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
600 }
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
601
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
602 reset();
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29212
diff changeset
603
29209
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
604 return CONTROL_OK;
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
605
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
606 err_out2:
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
607 AudioUnitUninitialize(ao->theOutputUnit);
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
608 err_out1:
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
609 CloseComponent(ao->theOutputUnit);
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
610 err_out:
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
611 av_fifo_free(ao->buffer);
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
612 free(ao);
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
613 ao = NULL;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29212
diff changeset
614 return CONTROL_FALSE;
29209
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
615 }
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
616
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
617 /*****************************************************************************
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
618 * Setup a encoded digital stream (SPDIF)
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
619 *****************************************************************************/
29212
eda346733b8c Add missing 'void' to parameterless function declarations.
diego
parents: 29209
diff changeset
620 static int OpenSPDIF(void)
29209
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
621 {
31650
955cdbd3ac02 Fix cosmetics after r31715.
adrian
parents: 31649
diff changeset
622 OSStatus err = noErr;
955cdbd3ac02 Fix cosmetics after r31715.
adrian
parents: 31649
diff changeset
623 UInt32 i_param_size, b_mix = 0;
955cdbd3ac02 Fix cosmetics after r31715.
adrian
parents: 31649
diff changeset
624 Boolean b_writeable = 0;
955cdbd3ac02 Fix cosmetics after r31715.
adrian
parents: 31649
diff changeset
625 AudioStreamID *p_streams = NULL;
955cdbd3ac02 Fix cosmetics after r31715.
adrian
parents: 31649
diff changeset
626 int i, i_streams = 0;
31647
976c9554f284 Replace deprecated functions in ao_coreaudio with their new ones introduced in OSX 10.4.
adrian
parents: 31646
diff changeset
627 AudioObjectPropertyAddress property_address;
29209
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
628
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
629 /* Start doing the SPDIF setup process. */
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
630 ao->b_digital = 1;
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
631
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
632 /* Hog the device. */
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
633 ao->i_hog_pid = getpid() ;
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
634
31647
976c9554f284 Replace deprecated functions in ao_coreaudio with their new ones introduced in OSX 10.4.
adrian
parents: 31646
diff changeset
635 err = SetAudioProperty(ao->i_selected_dev,
976c9554f284 Replace deprecated functions in ao_coreaudio with their new ones introduced in OSX 10.4.
adrian
parents: 31646
diff changeset
636 kAudioDevicePropertyHogMode,
976c9554f284 Replace deprecated functions in ao_coreaudio with their new ones introduced in OSX 10.4.
adrian
parents: 31646
diff changeset
637 sizeof(ao->i_hog_pid), &ao->i_hog_pid);
29209
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
638 if (err != noErr)
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
639 {
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
640 ao_msg(MSGT_AO, MSGL_WARN, "failed to set hogmode: [%4.4s]\n", (char *)&err);
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
641 ao->i_hog_pid = -1;
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
642 goto err_out;
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
643 }
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
644
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
645 /* Set mixable to false if we are allowed to. */
31647
976c9554f284 Replace deprecated functions in ao_coreaudio with their new ones introduced in OSX 10.4.
adrian
parents: 31646
diff changeset
646 err = IsAudioPropertySettable(ao->i_selected_dev,
976c9554f284 Replace deprecated functions in ao_coreaudio with their new ones introduced in OSX 10.4.
adrian
parents: 31646
diff changeset
647 kAudioDevicePropertySupportsMixing,
976c9554f284 Replace deprecated functions in ao_coreaudio with their new ones introduced in OSX 10.4.
adrian
parents: 31646
diff changeset
648 &b_writeable);
976c9554f284 Replace deprecated functions in ao_coreaudio with their new ones introduced in OSX 10.4.
adrian
parents: 31646
diff changeset
649 err = GetAudioProperty(ao->i_selected_dev,
976c9554f284 Replace deprecated functions in ao_coreaudio with their new ones introduced in OSX 10.4.
adrian
parents: 31646
diff changeset
650 kAudioDevicePropertySupportsMixing,
976c9554f284 Replace deprecated functions in ao_coreaudio with their new ones introduced in OSX 10.4.
adrian
parents: 31646
diff changeset
651 sizeof(UInt32), &b_mix);
29209
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
652 if (err != noErr && b_writeable)
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
653 {
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
654 b_mix = 0;
31647
976c9554f284 Replace deprecated functions in ao_coreaudio with their new ones introduced in OSX 10.4.
adrian
parents: 31646
diff changeset
655 err = SetAudioProperty(ao->i_selected_dev,
976c9554f284 Replace deprecated functions in ao_coreaudio with their new ones introduced in OSX 10.4.
adrian
parents: 31646
diff changeset
656 kAudioDevicePropertySupportsMixing,
976c9554f284 Replace deprecated functions in ao_coreaudio with their new ones introduced in OSX 10.4.
adrian
parents: 31646
diff changeset
657 sizeof(UInt32), &b_mix);
29209
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
658 ao->b_changed_mixing = 1;
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
659 }
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
660 if (err != noErr)
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
661 {
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
662 ao_msg(MSGT_AO, MSGL_WARN, "failed to set mixmode: [%4.4s]\n", (char *)&err);
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
663 goto err_out;
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
664 }
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
665
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
666 /* Get a list of all the streams on this device. */
31647
976c9554f284 Replace deprecated functions in ao_coreaudio with their new ones introduced in OSX 10.4.
adrian
parents: 31646
diff changeset
667 i_param_size = GetAudioPropertyArray(ao->i_selected_dev,
976c9554f284 Replace deprecated functions in ao_coreaudio with their new ones introduced in OSX 10.4.
adrian
parents: 31646
diff changeset
668 kAudioDevicePropertyStreams,
976c9554f284 Replace deprecated functions in ao_coreaudio with their new ones introduced in OSX 10.4.
adrian
parents: 31646
diff changeset
669 kAudioDevicePropertyScopeOutput,
976c9554f284 Replace deprecated functions in ao_coreaudio with their new ones introduced in OSX 10.4.
adrian
parents: 31646
diff changeset
670 (void **)&p_streams);
976c9554f284 Replace deprecated functions in ao_coreaudio with their new ones introduced in OSX 10.4.
adrian
parents: 31646
diff changeset
671
976c9554f284 Replace deprecated functions in ao_coreaudio with their new ones introduced in OSX 10.4.
adrian
parents: 31646
diff changeset
672 if (!i_param_size) {
976c9554f284 Replace deprecated functions in ao_coreaudio with their new ones introduced in OSX 10.4.
adrian
parents: 31646
diff changeset
673 ao_msg(MSGT_AO, MSGL_WARN, "could not get number of streams.\n");
29209
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
674 goto err_out;
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
675 }
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
676
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
677 i_streams = i_param_size / sizeof(AudioStreamID);
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
678
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
679 ao_msg(MSGT_AO, MSGL_V, "current device stream number: %d\n", i_streams);
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
680
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
681 for (i = 0; i < i_streams && ao->i_stream_index < 0; ++i)
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
682 {
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
683 /* Find a stream with a cac3 stream. */
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
684 AudioStreamBasicDescription *p_format_list = NULL;
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
685 int i_formats = 0, j = 0, b_digital = 0;
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
686
31647
976c9554f284 Replace deprecated functions in ao_coreaudio with their new ones introduced in OSX 10.4.
adrian
parents: 31646
diff changeset
687 i_param_size = GetGlobalAudioPropertyArray(p_streams[i],
976c9554f284 Replace deprecated functions in ao_coreaudio with their new ones introduced in OSX 10.4.
adrian
parents: 31646
diff changeset
688 kAudioStreamPropertyPhysicalFormats,
976c9554f284 Replace deprecated functions in ao_coreaudio with their new ones introduced in OSX 10.4.
adrian
parents: 31646
diff changeset
689 (void **)&p_format_list);
976c9554f284 Replace deprecated functions in ao_coreaudio with their new ones introduced in OSX 10.4.
adrian
parents: 31646
diff changeset
690
976c9554f284 Replace deprecated functions in ao_coreaudio with their new ones introduced in OSX 10.4.
adrian
parents: 31646
diff changeset
691 if (!i_param_size) {
31891
4f17ff5b3cbc Fix a bunch of grammar and spelling errors in mp_msg calls.
diego
parents: 31660
diff changeset
692 ao_msg(MSGT_AO, MSGL_WARN,
4f17ff5b3cbc Fix a bunch of grammar and spelling errors in mp_msg calls.
diego
parents: 31660
diff changeset
693 "Could not get number of stream formats.\n");
29209
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
694 continue;
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
695 }
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
696
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
697 i_formats = i_param_size / sizeof(AudioStreamBasicDescription);
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
698
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
699 /* Check if one of the supported formats is a digital format. */
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
700 for (j = 0; j < i_formats; ++j)
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
701 {
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
702 if (p_format_list[j].mFormatID == 'IAC3' ||
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
703 p_format_list[j].mFormatID == kAudioFormat60958AC3)
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
704 {
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
705 b_digital = 1;
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
706 break;
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
707 }
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
708 }
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
709
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
710 if (b_digital)
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
711 {
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
712 /* If this stream supports a digital (cac3) format, then set it. */
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
713 int i_requested_rate_format = -1;
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
714 int i_current_rate_format = -1;
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
715 int i_backup_rate_format = -1;
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
716
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
717 ao->i_stream_id = p_streams[i];
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
718 ao->i_stream_index = i;
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
719
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
720 if (ao->b_revert == 0)
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
721 {
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
722 /* Retrieve the original format of this stream first if not done so already. */
31647
976c9554f284 Replace deprecated functions in ao_coreaudio with their new ones introduced in OSX 10.4.
adrian
parents: 31646
diff changeset
723 err = GetAudioProperty(ao->i_stream_id,
976c9554f284 Replace deprecated functions in ao_coreaudio with their new ones introduced in OSX 10.4.
adrian
parents: 31646
diff changeset
724 kAudioStreamPropertyPhysicalFormat,
976c9554f284 Replace deprecated functions in ao_coreaudio with their new ones introduced in OSX 10.4.
adrian
parents: 31646
diff changeset
725 sizeof(ao->sfmt_revert), &ao->sfmt_revert);
29209
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
726 if (err != noErr)
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
727 {
31891
4f17ff5b3cbc Fix a bunch of grammar and spelling errors in mp_msg calls.
diego
parents: 31660
diff changeset
728 ao_msg(MSGT_AO, MSGL_WARN,
4f17ff5b3cbc Fix a bunch of grammar and spelling errors in mp_msg calls.
diego
parents: 31660
diff changeset
729 "Could not retrieve the original stream format: [%4.4s]\n",
4f17ff5b3cbc Fix a bunch of grammar and spelling errors in mp_msg calls.
diego
parents: 31660
diff changeset
730 (char *)&err);
29209
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
731 if (p_format_list) free(p_format_list);
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
732 continue;
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
733 }
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
734 ao->b_revert = 1;
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
735 }
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
736
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
737 for (j = 0; j < i_formats; ++j)
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
738 if (p_format_list[j].mFormatID == 'IAC3' ||
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
739 p_format_list[j].mFormatID == kAudioFormat60958AC3)
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
740 {
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
741 if (p_format_list[j].mSampleRate == ao->stream_format.mSampleRate)
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
742 {
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
743 i_requested_rate_format = j;
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
744 break;
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
745 }
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
746 if (p_format_list[j].mSampleRate == ao->sfmt_revert.mSampleRate)
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
747 i_current_rate_format = j;
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
748 else if (i_backup_rate_format < 0 || p_format_list[j].mSampleRate > p_format_list[i_backup_rate_format].mSampleRate)
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
749 i_backup_rate_format = j;
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
750 }
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
751
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
752 if (i_requested_rate_format >= 0) /* We prefer to output at the samplerate of the original audio. */
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
753 ao->stream_format = p_format_list[i_requested_rate_format];
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
754 else if (i_current_rate_format >= 0) /* If not possible, we will try to use the current samplerate of the device. */
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
755 ao->stream_format = p_format_list[i_current_rate_format];
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
756 else ao->stream_format = p_format_list[i_backup_rate_format]; /* And if we have to, any digital format will be just fine (highest rate possible). */
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
757 }
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
758 if (p_format_list) free(p_format_list);
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
759 }
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
760 if (p_streams) free(p_streams);
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
761
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
762 if (ao->i_stream_index < 0)
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
763 {
31891
4f17ff5b3cbc Fix a bunch of grammar and spelling errors in mp_msg calls.
diego
parents: 31660
diff changeset
764 ao_msg(MSGT_AO, MSGL_WARN,
4f17ff5b3cbc Fix a bunch of grammar and spelling errors in mp_msg calls.
diego
parents: 31660
diff changeset
765 "Cannot find any digital output stream format when OpenSPDIF().\n");
29209
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
766 goto err_out;
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
767 }
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
768
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
769 print_format(MSGL_V, "original stream format:", &ao->sfmt_revert);
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
770
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
771 if (!AudioStreamChangeFormat(ao->i_stream_id, ao->stream_format))
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
772 goto err_out;
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
773
31647
976c9554f284 Replace deprecated functions in ao_coreaudio with their new ones introduced in OSX 10.4.
adrian
parents: 31646
diff changeset
774 property_address.mSelector = kAudioDevicePropertyDeviceHasChanged;
976c9554f284 Replace deprecated functions in ao_coreaudio with their new ones introduced in OSX 10.4.
adrian
parents: 31646
diff changeset
775 property_address.mScope = kAudioObjectPropertyScopeGlobal;
976c9554f284 Replace deprecated functions in ao_coreaudio with their new ones introduced in OSX 10.4.
adrian
parents: 31646
diff changeset
776 property_address.mElement = kAudioObjectPropertyElementMaster;
976c9554f284 Replace deprecated functions in ao_coreaudio with their new ones introduced in OSX 10.4.
adrian
parents: 31646
diff changeset
777
976c9554f284 Replace deprecated functions in ao_coreaudio with their new ones introduced in OSX 10.4.
adrian
parents: 31646
diff changeset
778 err = AudioObjectAddPropertyListener(ao->i_selected_dev,
976c9554f284 Replace deprecated functions in ao_coreaudio with their new ones introduced in OSX 10.4.
adrian
parents: 31646
diff changeset
779 &property_address,
29209
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
780 DeviceListener,
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
781 NULL);
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
782 if (err != noErr)
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
783 ao_msg(MSGT_AO, MSGL_WARN, "AudioDeviceAddPropertyListener for kAudioDevicePropertyDeviceHasChanged failed: [%4.4s]\n", (char *)&err);
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
784
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
785
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
786 /* FIXME: If output stream is not native byte-order, we need change endian somewhere. */
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
787 /* Although there's no such case reported. */
29401
f01023c524c3 Replace WORDS_BIGENDIAN by HAVE_BIGENDIAN in all internal code.
diego
parents: 29263
diff changeset
788 #if HAVE_BIGENDIAN
29209
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
789 if (!(ao->stream_format.mFormatFlags & kAudioFormatFlagIsBigEndian))
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
790 #else
32364
d9c8f66f77e1 AC-3 streams need to be byteswapped on little-endian machines.
diego
parents: 31891
diff changeset
791 /* tell mplayer that we need a byteswap on AC3 streams, */
d9c8f66f77e1 AC-3 streams need to be byteswapped on little-endian machines.
diego
parents: 31891
diff changeset
792 if (ao->stream_format.mFormatID & kAudioFormat60958AC3)
d9c8f66f77e1 AC-3 streams need to be byteswapped on little-endian machines.
diego
parents: 31891
diff changeset
793 ao_data.format = AF_FORMAT_AC3_LE;
d9c8f66f77e1 AC-3 streams need to be byteswapped on little-endian machines.
diego
parents: 31891
diff changeset
794
29209
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
795 if (ao->stream_format.mFormatFlags & kAudioFormatFlagIsBigEndian)
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
796 #endif
31891
4f17ff5b3cbc Fix a bunch of grammar and spelling errors in mp_msg calls.
diego
parents: 31660
diff changeset
797 ao_msg(MSGT_AO, MSGL_WARN,
4f17ff5b3cbc Fix a bunch of grammar and spelling errors in mp_msg calls.
diego
parents: 31660
diff changeset
798 "Output stream has non-native byte order, digital output may fail.\n");
29209
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
799
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
800 /* For ac3/dts, just use packet size 6144 bytes as chunk size. */
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
801 ao->chunk_size = ao->stream_format.mBytesPerPacket;
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
802
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
803 ao_data.samplerate = ao->stream_format.mSampleRate;
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
804 ao_data.channels = ao->stream_format.mChannelsPerFrame;
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
805 ao_data.bps = ao_data.samplerate * (ao->stream_format.mBytesPerPacket/ao->stream_format.mFramesPerPacket);
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
806 ao_data.outburst = ao->chunk_size;
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
807 ao_data.buffersize = ao_data.bps;
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
808
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
809 ao->num_chunks = (ao_data.bps+ao->chunk_size-1)/ao->chunk_size;
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
810 ao->buffer_len = ao->num_chunks * ao->chunk_size;
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
811 ao->buffer = av_fifo_alloc(ao->buffer_len);
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
812
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
813 ao_msg(MSGT_AO,MSGL_V, "using %5d chunks of %d bytes (buffer len %d bytes)\n", (int)ao->num_chunks, (int)ao->chunk_size, (int)ao->buffer_len);
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
814
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
815
31647
976c9554f284 Replace deprecated functions in ao_coreaudio with their new ones introduced in OSX 10.4.
adrian
parents: 31646
diff changeset
816 /* Create IOProc callback. */
976c9554f284 Replace deprecated functions in ao_coreaudio with their new ones introduced in OSX 10.4.
adrian
parents: 31646
diff changeset
817 err = AudioDeviceCreateIOProcID(ao->i_selected_dev,
976c9554f284 Replace deprecated functions in ao_coreaudio with their new ones introduced in OSX 10.4.
adrian
parents: 31646
diff changeset
818 (AudioDeviceIOProc)RenderCallbackSPDIF,
976c9554f284 Replace deprecated functions in ao_coreaudio with their new ones introduced in OSX 10.4.
adrian
parents: 31646
diff changeset
819 (void *)ao,
976c9554f284 Replace deprecated functions in ao_coreaudio with their new ones introduced in OSX 10.4.
adrian
parents: 31646
diff changeset
820 &ao->renderCallback);
976c9554f284 Replace deprecated functions in ao_coreaudio with their new ones introduced in OSX 10.4.
adrian
parents: 31646
diff changeset
821
976c9554f284 Replace deprecated functions in ao_coreaudio with their new ones introduced in OSX 10.4.
adrian
parents: 31646
diff changeset
822 if (err != noErr || ao->renderCallback == NULL)
29209
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
823 {
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
824 ao_msg(MSGT_AO, MSGL_WARN, "AudioDeviceAddIOProc failed: [%4.4s]\n", (char *)&err);
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
825 goto err_out1;
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
826 }
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
827
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
828 reset();
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
829
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
830 return CONTROL_TRUE;
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
831
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
832 err_out1:
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
833 if (ao->b_revert)
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
834 AudioStreamChangeFormat(ao->i_stream_id, ao->sfmt_revert);
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
835 err_out:
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
836 if (ao->b_changed_mixing && ao->sfmt_revert.mFormatID != kAudioFormat60958AC3)
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
837 {
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
838 int b_mix = 1;
31647
976c9554f284 Replace deprecated functions in ao_coreaudio with their new ones introduced in OSX 10.4.
adrian
parents: 31646
diff changeset
839 err = SetAudioProperty(ao->i_selected_dev,
976c9554f284 Replace deprecated functions in ao_coreaudio with their new ones introduced in OSX 10.4.
adrian
parents: 31646
diff changeset
840 kAudioDevicePropertySupportsMixing,
976c9554f284 Replace deprecated functions in ao_coreaudio with their new ones introduced in OSX 10.4.
adrian
parents: 31646
diff changeset
841 sizeof(int), &b_mix);
29209
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
842 if (err != noErr)
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
843 ao_msg(MSGT_AO, MSGL_WARN, "failed to set mixmode: [%4.4s]\n",
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
844 (char *)&err);
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
845 }
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
846 if (ao->i_hog_pid == getpid())
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
847 {
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
848 ao->i_hog_pid = -1;
31647
976c9554f284 Replace deprecated functions in ao_coreaudio with their new ones introduced in OSX 10.4.
adrian
parents: 31646
diff changeset
849 err = SetAudioProperty(ao->i_selected_dev,
976c9554f284 Replace deprecated functions in ao_coreaudio with their new ones introduced in OSX 10.4.
adrian
parents: 31646
diff changeset
850 kAudioDevicePropertyHogMode,
976c9554f284 Replace deprecated functions in ao_coreaudio with their new ones introduced in OSX 10.4.
adrian
parents: 31646
diff changeset
851 sizeof(ao->i_hog_pid), &ao->i_hog_pid);
29209
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
852 if (err != noErr)
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
853 ao_msg(MSGT_AO, MSGL_WARN, "Could not release hogmode: [%4.4s]\n",
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
854 (char *)&err);
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
855 }
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
856 av_fifo_free(ao->buffer);
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
857 free(ao);
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
858 ao = NULL;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29212
diff changeset
859 return CONTROL_FALSE;
29209
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
860 }
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
861
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
862 /*****************************************************************************
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
863 * AudioDeviceSupportsDigital: Check i_dev_id for digital stream support.
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
864 *****************************************************************************/
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
865 static int AudioDeviceSupportsDigital( AudioDeviceID i_dev_id )
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
866 {
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
867 UInt32 i_param_size = 0;
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
868 AudioStreamID *p_streams = NULL;
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
869 int i = 0, i_streams = 0;
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
870 int b_return = CONTROL_FALSE;
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
871
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
872 /* Retrieve all the output streams. */
31647
976c9554f284 Replace deprecated functions in ao_coreaudio with their new ones introduced in OSX 10.4.
adrian
parents: 31646
diff changeset
873 i_param_size = GetAudioPropertyArray(i_dev_id,
976c9554f284 Replace deprecated functions in ao_coreaudio with their new ones introduced in OSX 10.4.
adrian
parents: 31646
diff changeset
874 kAudioDevicePropertyStreams,
976c9554f284 Replace deprecated functions in ao_coreaudio with their new ones introduced in OSX 10.4.
adrian
parents: 31646
diff changeset
875 kAudioDevicePropertyScopeOutput,
976c9554f284 Replace deprecated functions in ao_coreaudio with their new ones introduced in OSX 10.4.
adrian
parents: 31646
diff changeset
876 (void **)&p_streams);
976c9554f284 Replace deprecated functions in ao_coreaudio with their new ones introduced in OSX 10.4.
adrian
parents: 31646
diff changeset
877
976c9554f284 Replace deprecated functions in ao_coreaudio with their new ones introduced in OSX 10.4.
adrian
parents: 31646
diff changeset
878 if (!i_param_size) {
976c9554f284 Replace deprecated functions in ao_coreaudio with their new ones introduced in OSX 10.4.
adrian
parents: 31646
diff changeset
879 ao_msg(MSGT_AO, MSGL_WARN, "could not get number of streams.\n");
29209
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
880 return CONTROL_FALSE;
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
881 }
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
882
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
883 i_streams = i_param_size / sizeof(AudioStreamID);
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
884
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
885 for (i = 0; i < i_streams; ++i)
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
886 {
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
887 if (AudioStreamSupportsDigital(p_streams[i]))
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
888 b_return = CONTROL_OK;
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
889 }
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
890
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
891 free(p_streams);
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
892 return b_return;
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
893 }
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
894
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
895 /*****************************************************************************
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
896 * AudioStreamSupportsDigital: Check i_stream_id for digital stream support.
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
897 *****************************************************************************/
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
898 static int AudioStreamSupportsDigital( AudioStreamID i_stream_id )
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
899 {
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
900 UInt32 i_param_size;
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
901 AudioStreamBasicDescription *p_format_list = NULL;
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
902 int i, i_formats, b_return = CONTROL_FALSE;
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
903
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
904 /* Retrieve all the stream formats supported by each output stream. */
31647
976c9554f284 Replace deprecated functions in ao_coreaudio with their new ones introduced in OSX 10.4.
adrian
parents: 31646
diff changeset
905 i_param_size = GetGlobalAudioPropertyArray(i_stream_id,
976c9554f284 Replace deprecated functions in ao_coreaudio with their new ones introduced in OSX 10.4.
adrian
parents: 31646
diff changeset
906 kAudioStreamPropertyPhysicalFormats,
976c9554f284 Replace deprecated functions in ao_coreaudio with their new ones introduced in OSX 10.4.
adrian
parents: 31646
diff changeset
907 (void **)&p_format_list);
976c9554f284 Replace deprecated functions in ao_coreaudio with their new ones introduced in OSX 10.4.
adrian
parents: 31646
diff changeset
908
976c9554f284 Replace deprecated functions in ao_coreaudio with their new ones introduced in OSX 10.4.
adrian
parents: 31646
diff changeset
909 if (!i_param_size) {
31891
4f17ff5b3cbc Fix a bunch of grammar and spelling errors in mp_msg calls.
diego
parents: 31660
diff changeset
910 ao_msg(MSGT_AO, MSGL_WARN, "Could not get number of stream formats.\n");
29209
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
911 return CONTROL_FALSE;
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
912 }
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
913
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
914 i_formats = i_param_size / sizeof(AudioStreamBasicDescription);
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
915
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
916 for (i = 0; i < i_formats; ++i)
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
917 {
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
918 print_format(MSGL_V, "supported format:", &p_format_list[i]);
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
919
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
920 if (p_format_list[i].mFormatID == 'IAC3' ||
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
921 p_format_list[i].mFormatID == kAudioFormat60958AC3)
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
922 b_return = CONTROL_OK;
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
923 }
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
924
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
925 free(p_format_list);
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
926 return b_return;
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
927 }
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
928
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
929 /*****************************************************************************
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
930 * AudioStreamChangeFormat: Change i_stream_id to change_format
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
931 *****************************************************************************/
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
932 static int AudioStreamChangeFormat( AudioStreamID i_stream_id, AudioStreamBasicDescription change_format )
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
933 {
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
934 OSStatus err = noErr;
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
935 int i;
31647
976c9554f284 Replace deprecated functions in ao_coreaudio with their new ones introduced in OSX 10.4.
adrian
parents: 31646
diff changeset
936 AudioObjectPropertyAddress property_address;
29209
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
937
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
938 static volatile int stream_format_changed;
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
939 stream_format_changed = 0;
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
940
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
941 print_format(MSGL_V, "setting stream format:", &change_format);
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
942
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
943 /* Install the callback. */
31647
976c9554f284 Replace deprecated functions in ao_coreaudio with their new ones introduced in OSX 10.4.
adrian
parents: 31646
diff changeset
944 property_address.mSelector = kAudioStreamPropertyPhysicalFormat;
976c9554f284 Replace deprecated functions in ao_coreaudio with their new ones introduced in OSX 10.4.
adrian
parents: 31646
diff changeset
945 property_address.mScope = kAudioObjectPropertyScopeGlobal;
976c9554f284 Replace deprecated functions in ao_coreaudio with their new ones introduced in OSX 10.4.
adrian
parents: 31646
diff changeset
946 property_address.mElement = kAudioObjectPropertyElementMaster;
976c9554f284 Replace deprecated functions in ao_coreaudio with their new ones introduced in OSX 10.4.
adrian
parents: 31646
diff changeset
947
976c9554f284 Replace deprecated functions in ao_coreaudio with their new ones introduced in OSX 10.4.
adrian
parents: 31646
diff changeset
948 err = AudioObjectAddPropertyListener(i_stream_id,
976c9554f284 Replace deprecated functions in ao_coreaudio with their new ones introduced in OSX 10.4.
adrian
parents: 31646
diff changeset
949 &property_address,
29209
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
950 StreamListener,
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
951 (void *)&stream_format_changed);
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
952 if (err != noErr)
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
953 {
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
954 ao_msg(MSGT_AO, MSGL_WARN, "AudioStreamAddPropertyListener failed: [%4.4s]\n", (char *)&err);
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
955 return CONTROL_FALSE;
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
956 }
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
957
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
958 /* Change the format. */
31647
976c9554f284 Replace deprecated functions in ao_coreaudio with their new ones introduced in OSX 10.4.
adrian
parents: 31646
diff changeset
959 err = SetAudioProperty(i_stream_id,
976c9554f284 Replace deprecated functions in ao_coreaudio with their new ones introduced in OSX 10.4.
adrian
parents: 31646
diff changeset
960 kAudioStreamPropertyPhysicalFormat,
976c9554f284 Replace deprecated functions in ao_coreaudio with their new ones introduced in OSX 10.4.
adrian
parents: 31646
diff changeset
961 sizeof(AudioStreamBasicDescription), &change_format);
29209
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
962 if (err != noErr)
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
963 {
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
964 ao_msg(MSGT_AO, MSGL_WARN, "could not set the stream format: [%4.4s]\n", (char *)&err);
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
965 return CONTROL_FALSE;
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
966 }
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
967
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
968 /* The AudioStreamSetProperty is not only asynchronious,
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
969 * it is also not Atomic, in its behaviour.
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
970 * Therefore we check 5 times before we really give up.
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
971 * FIXME: failing isn't actually implemented yet. */
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
972 for (i = 0; i < 5; ++i)
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
973 {
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
974 AudioStreamBasicDescription actual_format;
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
975 int j;
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
976 for (j = 0; !stream_format_changed && j < 50; ++j)
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
977 usec_sleep(10000);
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
978 if (stream_format_changed)
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
979 stream_format_changed = 0;
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
980 else
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
981 ao_msg(MSGT_AO, MSGL_V, "reached timeout\n" );
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
982
31647
976c9554f284 Replace deprecated functions in ao_coreaudio with their new ones introduced in OSX 10.4.
adrian
parents: 31646
diff changeset
983 err = GetAudioProperty(i_stream_id,
976c9554f284 Replace deprecated functions in ao_coreaudio with their new ones introduced in OSX 10.4.
adrian
parents: 31646
diff changeset
984 kAudioStreamPropertyPhysicalFormat,
976c9554f284 Replace deprecated functions in ao_coreaudio with their new ones introduced in OSX 10.4.
adrian
parents: 31646
diff changeset
985 sizeof(AudioStreamBasicDescription), &actual_format);
29209
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
986
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
987 print_format(MSGL_V, "actual format in use:", &actual_format);
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
988 if (actual_format.mSampleRate == change_format.mSampleRate &&
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
989 actual_format.mFormatID == change_format.mFormatID &&
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
990 actual_format.mFramesPerPacket == change_format.mFramesPerPacket)
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
991 {
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
992 /* The right format is now active. */
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
993 break;
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
994 }
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
995 /* We need to check again. */
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
996 }
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
997
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
998 /* Removing the property listener. */
31647
976c9554f284 Replace deprecated functions in ao_coreaudio with their new ones introduced in OSX 10.4.
adrian
parents: 31646
diff changeset
999 err = AudioObjectRemovePropertyListener(i_stream_id,
976c9554f284 Replace deprecated functions in ao_coreaudio with their new ones introduced in OSX 10.4.
adrian
parents: 31646
diff changeset
1000 &property_address,
976c9554f284 Replace deprecated functions in ao_coreaudio with their new ones introduced in OSX 10.4.
adrian
parents: 31646
diff changeset
1001 StreamListener,
976c9554f284 Replace deprecated functions in ao_coreaudio with their new ones introduced in OSX 10.4.
adrian
parents: 31646
diff changeset
1002 (void *)&stream_format_changed);
29209
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
1003 if (err != noErr)
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
1004 {
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
1005 ao_msg(MSGT_AO, MSGL_WARN, "AudioStreamRemovePropertyListener failed: [%4.4s]\n", (char *)&err);
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
1006 return CONTROL_FALSE;
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
1007 }
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
1008
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
1009 return CONTROL_TRUE;
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
1010 }
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
1011
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
1012 /*****************************************************************************
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
1013 * RenderCallbackSPDIF: callback for SPDIF audio output
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
1014 *****************************************************************************/
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
1015 static OSStatus RenderCallbackSPDIF( AudioDeviceID inDevice,
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
1016 const AudioTimeStamp * inNow,
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
1017 const void * inInputData,
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
1018 const AudioTimeStamp * inInputTime,
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
1019 AudioBufferList * outOutputData,
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
1020 const AudioTimeStamp * inOutputTime,
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
1021 void * threadGlobals )
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
1022 {
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
1023 int amt = av_fifo_size(ao->buffer);
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
1024 int req = outOutputData->mBuffers[ao->i_stream_index].mDataByteSize;
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
1025
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
1026 if (amt > req)
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
1027 amt = req;
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
1028 if (amt)
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
1029 read_buffer(ao->b_muted ? NULL : (unsigned char *)outOutputData->mBuffers[ao->i_stream_index].mData, amt);
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
1030
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
1031 return noErr;
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
1032 }
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
1033
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
1034
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
1035 static int play(void* output_samples,int num_bytes,int flags)
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29212
diff changeset
1036 {
29209
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
1037 int wrote, b_digital;
31651
1b5102a113e0 Process the CoreFoundation runloop in ao_coreaudio in case it's not being processed in the vo, e.g. when vo_corevideo is used with shared_buffer.
adrian
parents: 31650
diff changeset
1038 SInt32 exit_reason;
29209
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
1039
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
1040 // Check whether we need to reset the digital output stream.
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
1041 if (ao->b_digital && ao->b_stream_format_changed)
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
1042 {
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
1043 ao->b_stream_format_changed = 0;
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
1044 b_digital = AudioStreamSupportsDigital(ao->i_stream_id);
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
1045 if (b_digital)
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
1046 {
31891
4f17ff5b3cbc Fix a bunch of grammar and spelling errors in mp_msg calls.
diego
parents: 31660
diff changeset
1047 /* Current stream supports digital format output, let's set it. */
4f17ff5b3cbc Fix a bunch of grammar and spelling errors in mp_msg calls.
diego
parents: 31660
diff changeset
1048 ao_msg(MSGT_AO, MSGL_V,
4f17ff5b3cbc Fix a bunch of grammar and spelling errors in mp_msg calls.
diego
parents: 31660
diff changeset
1049 "Detected current stream supports digital, try to restore digital output...\n");
29209
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
1050
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
1051 if (!AudioStreamChangeFormat(ao->i_stream_id, ao->stream_format))
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
1052 {
31891
4f17ff5b3cbc Fix a bunch of grammar and spelling errors in mp_msg calls.
diego
parents: 31660
diff changeset
1053 ao_msg(MSGT_AO, MSGL_WARN, "Restoring digital output failed.\n");
29209
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
1054 }
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
1055 else
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
1056 {
31891
4f17ff5b3cbc Fix a bunch of grammar and spelling errors in mp_msg calls.
diego
parents: 31660
diff changeset
1057 ao_msg(MSGT_AO, MSGL_WARN, "Restoring digital output succeeded.\n");
29209
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
1058 reset();
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
1059 }
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
1060 }
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
1061 else
31891
4f17ff5b3cbc Fix a bunch of grammar and spelling errors in mp_msg calls.
diego
parents: 31660
diff changeset
1062 ao_msg(MSGT_AO, MSGL_V, "Detected current stream does not support digital.\n");
29209
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
1063 }
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
1064
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
1065 wrote=write_buffer(output_samples, num_bytes);
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
1066 audio_resume();
31651
1b5102a113e0 Process the CoreFoundation runloop in ao_coreaudio in case it's not being processed in the vo, e.g. when vo_corevideo is used with shared_buffer.
adrian
parents: 31650
diff changeset
1067
1b5102a113e0 Process the CoreFoundation runloop in ao_coreaudio in case it's not being processed in the vo, e.g. when vo_corevideo is used with shared_buffer.
adrian
parents: 31650
diff changeset
1068 do {
1b5102a113e0 Process the CoreFoundation runloop in ao_coreaudio in case it's not being processed in the vo, e.g. when vo_corevideo is used with shared_buffer.
adrian
parents: 31650
diff changeset
1069 exit_reason = CFRunLoopRunInMode(kCFRunLoopDefaultMode, 0.01, true);
1b5102a113e0 Process the CoreFoundation runloop in ao_coreaudio in case it's not being processed in the vo, e.g. when vo_corevideo is used with shared_buffer.
adrian
parents: 31650
diff changeset
1070 } while (exit_reason == kCFRunLoopRunHandledSource);
1b5102a113e0 Process the CoreFoundation runloop in ao_coreaudio in case it's not being processed in the vo, e.g. when vo_corevideo is used with shared_buffer.
adrian
parents: 31650
diff changeset
1071
29209
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
1072 return wrote;
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
1073 }
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
1074
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
1075 /* set variables and buffer to initial state */
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
1076 static void reset(void)
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
1077 {
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
1078 audio_pause();
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
1079 av_fifo_reset(ao->buffer);
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
1080 }
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
1081
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
1082
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
1083 /* return available space */
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
1084 static int get_space(void)
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
1085 {
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
1086 return ao->buffer_len - av_fifo_size(ao->buffer);
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
1087 }
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
1088
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
1089
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
1090 /* return delay until audio is played */
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
1091 static float get_delay(void)
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
1092 {
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
1093 // inaccurate, should also contain the data buffered e.g. by the OS
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
1094 return (float)av_fifo_size(ao->buffer)/(float)ao_data.bps;
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
1095 }
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
1096
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
1097
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
1098 /* unload plugin and deregister from coreaudio */
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
1099 static void uninit(int immed)
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
1100 {
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
1101 OSStatus err = noErr;
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
1102
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
1103 if (!immed) {
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
1104 long long timeleft=(1000000LL*av_fifo_size(ao->buffer))/ao_data.bps;
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
1105 ao_msg(MSGT_AO,MSGL_DBG2, "%d bytes left @%d bps (%d usec)\n", av_fifo_size(ao->buffer), ao_data.bps, (int)timeleft);
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
1106 usec_sleep((int)timeleft);
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
1107 }
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
1108
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
1109 if (!ao->b_digital) {
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
1110 AudioOutputUnitStop(ao->theOutputUnit);
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
1111 AudioUnitUninitialize(ao->theOutputUnit);
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
1112 CloseComponent(ao->theOutputUnit);
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
1113 }
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
1114 else {
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
1115 /* Stop device. */
31647
976c9554f284 Replace deprecated functions in ao_coreaudio with their new ones introduced in OSX 10.4.
adrian
parents: 31646
diff changeset
1116 err = AudioDeviceStop(ao->i_selected_dev, ao->renderCallback);
29209
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
1117 if (err != noErr)
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
1118 ao_msg(MSGT_AO, MSGL_WARN, "AudioDeviceStop failed: [%4.4s]\n", (char *)&err);
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
1119
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
1120 /* Remove IOProc callback. */
31647
976c9554f284 Replace deprecated functions in ao_coreaudio with their new ones introduced in OSX 10.4.
adrian
parents: 31646
diff changeset
1121 err = AudioDeviceDestroyIOProcID(ao->i_selected_dev, ao->renderCallback);
29209
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
1122 if (err != noErr)
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
1123 ao_msg(MSGT_AO, MSGL_WARN, "AudioDeviceRemoveIOProc failed: [%4.4s]\n", (char *)&err);
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
1124
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
1125 if (ao->b_revert)
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
1126 AudioStreamChangeFormat(ao->i_stream_id, ao->sfmt_revert);
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
1127
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
1128 if (ao->b_changed_mixing && ao->sfmt_revert.mFormatID != kAudioFormat60958AC3)
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
1129 {
31648
a09f02987594 Consistently use types as they are used by the API in ao_coreaudio.
adrian
parents: 31647
diff changeset
1130 UInt32 b_mix;
29209
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
1131 Boolean b_writeable;
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
1132 /* Revert mixable to true if we are allowed to. */
31647
976c9554f284 Replace deprecated functions in ao_coreaudio with their new ones introduced in OSX 10.4.
adrian
parents: 31646
diff changeset
1133 err = IsAudioPropertySettable(ao->i_selected_dev,
976c9554f284 Replace deprecated functions in ao_coreaudio with their new ones introduced in OSX 10.4.
adrian
parents: 31646
diff changeset
1134 kAudioDevicePropertySupportsMixing,
976c9554f284 Replace deprecated functions in ao_coreaudio with their new ones introduced in OSX 10.4.
adrian
parents: 31646
diff changeset
1135 &b_writeable);
976c9554f284 Replace deprecated functions in ao_coreaudio with their new ones introduced in OSX 10.4.
adrian
parents: 31646
diff changeset
1136 err = GetAudioProperty(ao->i_selected_dev,
976c9554f284 Replace deprecated functions in ao_coreaudio with their new ones introduced in OSX 10.4.
adrian
parents: 31646
diff changeset
1137 kAudioDevicePropertySupportsMixing,
976c9554f284 Replace deprecated functions in ao_coreaudio with their new ones introduced in OSX 10.4.
adrian
parents: 31646
diff changeset
1138 sizeof(UInt32), &b_mix);
29209
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
1139 if (err != noErr && b_writeable)
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
1140 {
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
1141 b_mix = 1;
31647
976c9554f284 Replace deprecated functions in ao_coreaudio with their new ones introduced in OSX 10.4.
adrian
parents: 31646
diff changeset
1142 err = SetAudioProperty(ao->i_selected_dev,
976c9554f284 Replace deprecated functions in ao_coreaudio with their new ones introduced in OSX 10.4.
adrian
parents: 31646
diff changeset
1143 kAudioDevicePropertySupportsMixing,
976c9554f284 Replace deprecated functions in ao_coreaudio with their new ones introduced in OSX 10.4.
adrian
parents: 31646
diff changeset
1144 sizeof(UInt32), &b_mix);
29209
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
1145 }
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
1146 if (err != noErr)
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
1147 ao_msg(MSGT_AO, MSGL_WARN, "failed to set mixmode: [%4.4s]\n", (char *)&err);
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
1148 }
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
1149 if (ao->i_hog_pid == getpid())
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
1150 {
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
1151 ao->i_hog_pid = -1;
31647
976c9554f284 Replace deprecated functions in ao_coreaudio with their new ones introduced in OSX 10.4.
adrian
parents: 31646
diff changeset
1152 err = SetAudioProperty(ao->i_selected_dev,
976c9554f284 Replace deprecated functions in ao_coreaudio with their new ones introduced in OSX 10.4.
adrian
parents: 31646
diff changeset
1153 kAudioDevicePropertyHogMode,
976c9554f284 Replace deprecated functions in ao_coreaudio with their new ones introduced in OSX 10.4.
adrian
parents: 31646
diff changeset
1154 sizeof(ao->i_hog_pid), &ao->i_hog_pid);
29209
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
1155 if (err != noErr) ao_msg(MSGT_AO, MSGL_WARN, "Could not release hogmode: [%4.4s]\n", (char *)&err);
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
1156 }
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
1157 }
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
1158
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
1159 av_fifo_free(ao->buffer);
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
1160 free(ao);
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
1161 ao = NULL;
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
1162 }
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
1163
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
1164
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
1165 /* stop playing, keep buffers (for pause) */
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
1166 static void audio_pause(void)
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
1167 {
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
1168 OSErr err=noErr;
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
1169
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
1170 /* Stop callback. */
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
1171 if (!ao->b_digital)
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
1172 {
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
1173 err=AudioOutputUnitStop(ao->theOutputUnit);
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
1174 if (err != noErr)
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
1175 ao_msg(MSGT_AO,MSGL_WARN, "AudioOutputUnitStop returned [%4.4s]\n", (char *)&err);
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
1176 }
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
1177 else
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
1178 {
31647
976c9554f284 Replace deprecated functions in ao_coreaudio with their new ones introduced in OSX 10.4.
adrian
parents: 31646
diff changeset
1179 err = AudioDeviceStop(ao->i_selected_dev, ao->renderCallback);
29209
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
1180 if (err != noErr)
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
1181 ao_msg(MSGT_AO, MSGL_WARN, "AudioDeviceStop failed: [%4.4s]\n", (char *)&err);
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
1182 }
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
1183 ao->paused = 1;
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
1184 }
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
1185
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
1186
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
1187 /* resume playing, after audio_pause() */
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
1188 static void audio_resume(void)
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
1189 {
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
1190 OSErr err=noErr;
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
1191
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
1192 if (!ao->paused)
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
1193 return;
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
1194
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
1195 /* Start callback. */
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
1196 if (!ao->b_digital)
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
1197 {
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
1198 err = AudioOutputUnitStart(ao->theOutputUnit);
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
1199 if (err != noErr)
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
1200 ao_msg(MSGT_AO,MSGL_WARN, "AudioOutputUnitStart returned [%4.4s]\n", (char *)&err);
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
1201 }
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
1202 else
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
1203 {
31647
976c9554f284 Replace deprecated functions in ao_coreaudio with their new ones introduced in OSX 10.4.
adrian
parents: 31646
diff changeset
1204 err = AudioDeviceStart(ao->i_selected_dev, ao->renderCallback);
29209
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
1205 if (err != noErr)
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
1206 ao_msg(MSGT_AO, MSGL_WARN, "AudioDeviceStart failed: [%4.4s]\n", (char *)&err);
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
1207 }
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
1208 ao->paused = 0;
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
1209 }
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
1210
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
1211 /*****************************************************************************
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
1212 * StreamListener
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
1213 *****************************************************************************/
31647
976c9554f284 Replace deprecated functions in ao_coreaudio with their new ones introduced in OSX 10.4.
adrian
parents: 31646
diff changeset
1214 static OSStatus StreamListener( AudioObjectID inObjectID,
976c9554f284 Replace deprecated functions in ao_coreaudio with their new ones introduced in OSX 10.4.
adrian
parents: 31646
diff changeset
1215 UInt32 inNumberAddresses,
976c9554f284 Replace deprecated functions in ao_coreaudio with their new ones introduced in OSX 10.4.
adrian
parents: 31646
diff changeset
1216 const AudioObjectPropertyAddress inAddresses[],
976c9554f284 Replace deprecated functions in ao_coreaudio with their new ones introduced in OSX 10.4.
adrian
parents: 31646
diff changeset
1217 void *inClientData )
29209
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
1218 {
31647
976c9554f284 Replace deprecated functions in ao_coreaudio with their new ones introduced in OSX 10.4.
adrian
parents: 31646
diff changeset
1219 for (int i=0; i < inNumberAddresses; ++i)
29209
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
1220 {
31647
976c9554f284 Replace deprecated functions in ao_coreaudio with their new ones introduced in OSX 10.4.
adrian
parents: 31646
diff changeset
1221 if (inAddresses[i].mSelector == kAudioStreamPropertyPhysicalFormat) {
976c9554f284 Replace deprecated functions in ao_coreaudio with their new ones introduced in OSX 10.4.
adrian
parents: 31646
diff changeset
1222 ao_msg(MSGT_AO, MSGL_WARN, "got notify kAudioStreamPropertyPhysicalFormat changed.\n");
29209
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
1223 if (inClientData)
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
1224 *(volatile int *)inClientData = 1;
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
1225 break;
31647
976c9554f284 Replace deprecated functions in ao_coreaudio with their new ones introduced in OSX 10.4.
adrian
parents: 31646
diff changeset
1226 }
29209
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
1227 }
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
1228 return noErr;
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
1229 }
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
1230
31647
976c9554f284 Replace deprecated functions in ao_coreaudio with their new ones introduced in OSX 10.4.
adrian
parents: 31646
diff changeset
1231 static OSStatus DeviceListener( AudioObjectID inObjectID,
976c9554f284 Replace deprecated functions in ao_coreaudio with their new ones introduced in OSX 10.4.
adrian
parents: 31646
diff changeset
1232 UInt32 inNumberAddresses,
976c9554f284 Replace deprecated functions in ao_coreaudio with their new ones introduced in OSX 10.4.
adrian
parents: 31646
diff changeset
1233 const AudioObjectPropertyAddress inAddresses[],
976c9554f284 Replace deprecated functions in ao_coreaudio with their new ones introduced in OSX 10.4.
adrian
parents: 31646
diff changeset
1234 void *inClientData )
29209
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
1235 {
31647
976c9554f284 Replace deprecated functions in ao_coreaudio with their new ones introduced in OSX 10.4.
adrian
parents: 31646
diff changeset
1236 for (int i=0; i < inNumberAddresses; ++i)
29209
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
1237 {
31647
976c9554f284 Replace deprecated functions in ao_coreaudio with their new ones introduced in OSX 10.4.
adrian
parents: 31646
diff changeset
1238 if (inAddresses[i].mSelector == kAudioDevicePropertyDeviceHasChanged) {
29209
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
1239 ao_msg(MSGT_AO, MSGL_WARN, "got notify kAudioDevicePropertyDeviceHasChanged.\n");
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
1240 ao->b_stream_format_changed = 1;
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
1241 break;
31647
976c9554f284 Replace deprecated functions in ao_coreaudio with their new ones introduced in OSX 10.4.
adrian
parents: 31646
diff changeset
1242 }
29209
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
1243 }
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
1244 return noErr;
631aac106b7a Rename macosx audio output driver to coreaudio.
diego
parents:
diff changeset
1245 }