summaryrefslogtreecommitdiffstats
path: root/sys/osxaudio/gstosxringbuffer.c
diff options
context:
space:
mode:
authorMichael Smith <msmith@xiph.org>2008-08-26 21:13:08 +0000
committerMichael Smith <msmith@xiph.org>2008-08-26 21:13:08 +0000
commit192c1b942b5a727b03223869e7213af1941b0d5d (patch)
tree977ed239522f2b38c229710fd952293bc26b8119 /sys/osxaudio/gstosxringbuffer.c
parent2ea5c05241edb2ca63967c3056a5ee3347bce576 (diff)
sys/osxaudio/: Rewrite caps setting and ring buffer initialisation.
Original commit message from CVS: * sys/osxaudio/Makefile.am: * sys/osxaudio/gstosxaudio.c: * sys/osxaudio/gstosxaudiosink.c: * sys/osxaudio/gstosxaudiosink.h: * sys/osxaudio/gstosxaudiosrc.c: * sys/osxaudio/gstosxaudiosrc.h: * sys/osxaudio/gstosxringbuffer.c: * sys/osxaudio/gstosxringbuffer.h: Rewrite caps setting and ring buffer initialisation. Previously we never told CoreAudio what format we were going to send it, so it only worked due to luck, and not at all on some hardware. Now we explicitly advertise what formats the hardware supports, and then configure the selected one correctly.
Diffstat (limited to 'sys/osxaudio/gstosxringbuffer.c')
-rw-r--r--sys/osxaudio/gstosxringbuffer.c88
1 files changed, 54 insertions, 34 deletions
diff --git a/sys/osxaudio/gstosxringbuffer.c b/sys/osxaudio/gstosxringbuffer.c
index 428c3806..11689381 100644
--- a/sys/osxaudio/gstosxringbuffer.c
+++ b/sys/osxaudio/gstosxringbuffer.c
@@ -137,37 +137,7 @@ static void
gst_osx_ring_buffer_init (GstOsxRingBuffer * ringbuffer,
GstOsxRingBufferClass * g_class)
{
- OSStatus status;
- UInt32 propertySize;
-
- /* currently do bugger all */
- GST_DEBUG ("osx ring buffer init");
- propertySize = sizeof (ringbuffer->device_id);
- status =
- AudioHardwareGetProperty (kAudioHardwarePropertyDefaultOutputDevice,
- &propertySize, &(ringbuffer->device_id));
- GST_DEBUG ("osx ring buffer called AudioHardwareGetProperty");
- if (status) {
- GST_WARNING ("AudioHardwareGetProperty returned %d", (int) status);
- } else {
- GST_DEBUG ("AudioHardwareGetProperty returned 0");
- }
- if (ringbuffer->device_id == kAudioDeviceUnknown) {
- GST_DEBUG ("AudioHardwareGetProperty: device_id is kAudioDeviceUnknown");
- }
- GST_DEBUG ("AudioHardwareGetProperty: device_id is %lu",
- ringbuffer->device_id);
- /* get requested buffer length */
- propertySize = sizeof (ringbuffer->buffer_len);
- status =
- AudioDeviceGetProperty (ringbuffer->device_id, 0, false,
- kAudioDevicePropertyBufferSize, &propertySize, &ringbuffer->buffer_len);
- if (status) {
- GST_WARNING
- ("AudioDeviceGetProperty returned %d when getting kAudioDevicePropertyBufferSize",
- (int) status);
- }
- GST_DEBUG ("%5d ringbuffer->buffer_len", (int) ringbuffer->buffer_len);
+ /* Nothing to do right now */
}
static void
@@ -199,15 +169,65 @@ gst_osx_ring_buffer_close_device (GstRingBuffer * buf)
static gboolean
gst_osx_ring_buffer_acquire (GstRingBuffer * buf, GstRingBufferSpec * spec)
{
- /* stub, we need to allocate ringbuffer memory */
+ /* Configure the output stream and allocate ringbuffer memory */
GstOsxRingBuffer *osxbuf;
+ AudioStreamBasicDescription asbd;
+ AudioStreamBasicDescription asbd2;
+ OSStatus status;
+ UInt32 buffer_len;
+ UInt32 propertySize;
osxbuf = GST_OSX_RING_BUFFER (buf);
- spec->segsize = osxbuf->buffer_len;
+ /* Fill out the audio description we're going to be using */
+ asbd.mFormatID = kAudioFormatLinearPCM;
+ asbd.mSampleRate = (double) spec->rate;
+ asbd.mChannelsPerFrame = spec->channels;
+ asbd.mFormatFlags = kAudioFormatFlagsNativeFloatPacked;
+ asbd.mBytesPerFrame = spec->channels * sizeof (float);
+ asbd.mBitsPerChannel = sizeof (float) * 8;
+ asbd.mBytesPerPacket = spec->channels * sizeof (float);
+ asbd.mFramesPerPacket = 1;
+ asbd.mReserved = 0;
+
+ GST_LOG_OBJECT (osxbuf, "Format: %x, %f, %d, %x, %d, %d, %d, %d, %d",
+ asbd.mFormatID,
+ asbd.mSampleRate,
+ asbd.mChannelsPerFrame,
+ asbd.mFormatFlags,
+ asbd.mBytesPerFrame,
+ asbd.mBitsPerChannel,
+ asbd.mBytesPerPacket, asbd.mFramesPerPacket, asbd.mReserved);
+
+ GST_DEBUG_OBJECT (osxbuf, "Using stream_id %d, setting output format",
+ (int) osxbuf->stream_id);
+
+ propertySize = sizeof (asbd);
+ status = AudioStreamSetProperty (osxbuf->stream_id, NULL, /* Change immediately */
+ 0, /* Master channel */
+ kAudioStreamPropertyVirtualFormat, propertySize, &asbd);
+
+ if (status) {
+ GST_WARNING_OBJECT (osxbuf, "Failed to set output description: %lx",
+ status);
+ return FALSE;
+ }
+
+ /* get requested buffer length to use */
+ propertySize = sizeof (buffer_len);
+ status = AudioDeviceGetProperty (osxbuf->device_id, 0, false, /* TODO, this should be true for the source element */
+ kAudioDevicePropertyBufferSize, &propertySize, &buffer_len);
+
+ if (status) {
+ GST_WARNING_OBJECT (osxbuf,
+ "AudioDeviceGetProperty returned %d when getting "
+ "kAudioDevicePropertyBufferSize", (int) status);
+ }
+ GST_DEBUG_OBJECT (osxbuf, "%5d osxbuf->buffer_len", (int) buffer_len);
+ spec->segsize = buffer_len;
spec->segtotal = 16;
- GST_DEBUG ("osx ring buffer acquire");
+ GST_DEBUG_OBJECT (osxbuf, "osx ring buffer acquired");
buf->data = gst_buffer_new_and_alloc (spec->segtotal * spec->segsize);
memset (GST_BUFFER_DATA (buf->data), 0, GST_BUFFER_SIZE (buf->data));