filename | src/drivers/audio_osx.m |
changeset | 1024:c67f2d61ab97 |
prev | 964:f2f3c7612d06 |
author | nkeynes |
date | Sun Jan 31 18:35:06 2010 +1000 (14 years ago) |
permissions | -rw-r--r-- |
last change | Refactor CDROM host support - Completely separate GDROM hardware (in gdrom/gdrom.c) from generic CDROM support (now in drivers/cdrom) - Add concept of 'sector sources' that can be mixed and matched to create cdrom discs (makes support of arbitrary disc types much simpler) |
file | annotate | diff | log | raw |
nkeynes@964 | 1 | /** |
nkeynes@964 | 2 | * $Id$ |
nkeynes@964 | 3 | * |
nkeynes@964 | 4 | * The darwin core-audio audio driver |
nkeynes@964 | 5 | * |
nkeynes@964 | 6 | * Copyright (c) 2008 Nathan Keynes. |
nkeynes@964 | 7 | * |
nkeynes@964 | 8 | * This program is free software; you can redistribute it and/or modify |
nkeynes@964 | 9 | * it under the terms of the GNU General Public License as published by |
nkeynes@964 | 10 | * the Free Software Foundation; either version 2 of the License, or |
nkeynes@964 | 11 | * (at your option) any later version. |
nkeynes@964 | 12 | * |
nkeynes@964 | 13 | * This program is distributed in the hope that it will be useful, |
nkeynes@964 | 14 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
nkeynes@964 | 15 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
nkeynes@964 | 16 | * GNU General Public License for more details. |
nkeynes@964 | 17 | */ |
nkeynes@964 | 18 | #include <stdio.h> |
nkeynes@964 | 19 | #include <unistd.h> |
nkeynes@964 | 20 | #include <CoreAudio/CoreAudio.h> |
nkeynes@964 | 21 | #include "aica/audio.h" |
nkeynes@964 | 22 | #include "lxdream.h" |
nkeynes@964 | 23 | |
nkeynes@964 | 24 | #define BUFFER_SIZE (sizeof(float)*2*2205) |
nkeynes@964 | 25 | |
nkeynes@964 | 26 | static AudioDeviceID output_device; |
nkeynes@964 | 27 | static volatile audio_buffer_t output_buffer = NULL; |
nkeynes@964 | 28 | static uint32_t buffer_size; |
nkeynes@964 | 29 | |
nkeynes@1024 | 30 | static OSStatus audio_osx_callback( AudioDeviceID inDevice, |
nkeynes@964 | 31 | const AudioTimeStamp *inNow, |
nkeynes@964 | 32 | const AudioBufferList *inInputData, |
nkeynes@964 | 33 | const AudioTimeStamp *inInputTime, |
nkeynes@964 | 34 | AudioBufferList *outOutputData, |
nkeynes@964 | 35 | const AudioTimeStamp *inOutputTime, |
nkeynes@964 | 36 | void *inClientData) |
nkeynes@964 | 37 | { |
nkeynes@964 | 38 | char *output = outOutputData->mBuffers[0].mData; |
nkeynes@964 | 39 | int data_requested = buffer_size; |
nkeynes@964 | 40 | |
nkeynes@964 | 41 | while( output_buffer != NULL && data_requested > 0 ) { |
nkeynes@964 | 42 | int copysize = output_buffer->length - output_buffer->posn; |
nkeynes@964 | 43 | if( copysize > data_requested ) { |
nkeynes@964 | 44 | copysize = data_requested; |
nkeynes@964 | 45 | } |
nkeynes@964 | 46 | memcpy( output, &output_buffer->data[output_buffer->posn], copysize ); |
nkeynes@964 | 47 | output += copysize; |
nkeynes@964 | 48 | data_requested -= copysize; |
nkeynes@964 | 49 | output_buffer->posn += copysize; |
nkeynes@964 | 50 | if( output_buffer->posn >= output_buffer->length ) { |
nkeynes@964 | 51 | output_buffer = audio_next_read_buffer(); |
nkeynes@964 | 52 | } |
nkeynes@964 | 53 | } |
nkeynes@964 | 54 | if( data_requested > 0 ) { |
nkeynes@964 | 55 | memset( output, 0, data_requested ); |
nkeynes@964 | 56 | } |
nkeynes@964 | 57 | return noErr; |
nkeynes@964 | 58 | } |
nkeynes@964 | 59 | |
nkeynes@964 | 60 | static gboolean audio_osx_shutdown() |
nkeynes@964 | 61 | { |
nkeynes@964 | 62 | AudioDeviceStop( output_device, audio_osx_callback ); |
nkeynes@964 | 63 | AudioDeviceRemoveIOProc( output_device, audio_osx_callback ); |
nkeynes@964 | 64 | return TRUE; |
nkeynes@964 | 65 | } |
nkeynes@964 | 66 | |
nkeynes@964 | 67 | static gboolean audio_osx_init() |
nkeynes@964 | 68 | { |
nkeynes@964 | 69 | UInt32 size = sizeof(output_device); |
nkeynes@964 | 70 | AudioStreamBasicDescription outputDesc; |
nkeynes@964 | 71 | UInt32 outputDescSize = sizeof(outputDesc); |
nkeynes@964 | 72 | |
nkeynes@964 | 73 | if( AudioHardwareGetProperty(kAudioHardwarePropertyDefaultOutputDevice, |
nkeynes@964 | 74 | &size, &output_device) != noErr || |
nkeynes@964 | 75 | output_device == kAudioDeviceUnknown ) { |
nkeynes@964 | 76 | return FALSE; |
nkeynes@964 | 77 | } |
nkeynes@964 | 78 | |
nkeynes@964 | 79 | if( AudioDeviceGetProperty( output_device, 1, 0, kAudioDevicePropertyStreamFormat, |
nkeynes@964 | 80 | &outputDescSize, &outputDesc ) != noErr ) { |
nkeynes@964 | 81 | return FALSE; |
nkeynes@964 | 82 | } |
nkeynes@964 | 83 | |
nkeynes@964 | 84 | buffer_size = BUFFER_SIZE; |
nkeynes@964 | 85 | |
nkeynes@964 | 86 | if( AudioDeviceSetProperty( output_device, 0, 0, 0, kAudioDevicePropertyBufferSize, |
nkeynes@964 | 87 | sizeof(buffer_size), &buffer_size ) != noErr ) { |
nkeynes@964 | 88 | return FALSE; |
nkeynes@964 | 89 | } |
nkeynes@964 | 90 | |
nkeynes@964 | 91 | AudioDeviceAddIOProc( output_device, audio_osx_callback, NULL ); |
nkeynes@964 | 92 | return TRUE; |
nkeynes@964 | 93 | } |
nkeynes@964 | 94 | static gboolean audio_osx_process_buffer( audio_buffer_t buffer ) |
nkeynes@964 | 95 | { |
nkeynes@964 | 96 | if( output_buffer == NULL ) { |
nkeynes@964 | 97 | output_buffer = buffer; |
nkeynes@964 | 98 | output_buffer->posn = 0; |
nkeynes@964 | 99 | AudioDeviceStart(output_device, audio_osx_callback); |
nkeynes@964 | 100 | } |
nkeynes@964 | 101 | return FALSE; |
nkeynes@964 | 102 | } |
nkeynes@964 | 103 | |
nkeynes@1024 | 104 | static void audio_osx_start() |
nkeynes@964 | 105 | { |
nkeynes@964 | 106 | if( output_buffer != NULL ) { |
nkeynes@964 | 107 | AudioDeviceStart(output_device, audio_osx_callback); |
nkeynes@964 | 108 | } |
nkeynes@964 | 109 | } |
nkeynes@964 | 110 | |
nkeynes@1024 | 111 | static void audio_osx_stop() |
nkeynes@964 | 112 | { |
nkeynes@964 | 113 | AudioDeviceStop( output_device, audio_osx_callback ); |
nkeynes@964 | 114 | } |
nkeynes@964 | 115 | |
nkeynes@964 | 116 | |
nkeynes@1024 | 117 | static struct audio_driver audio_osx_driver = { |
nkeynes@964 | 118 | "osx", |
nkeynes@964 | 119 | N_("OS X CoreAudio system driver"), |
nkeynes@1024 | 120 | 1, // Preferred on OS X |
nkeynes@964 | 121 | DEFAULT_SAMPLE_RATE, |
nkeynes@964 | 122 | AUDIO_FMT_FLOATST, |
nkeynes@964 | 123 | audio_osx_init, |
nkeynes@964 | 124 | audio_osx_start, |
nkeynes@964 | 125 | audio_osx_process_buffer, |
nkeynes@964 | 126 | audio_osx_stop, |
nkeynes@964 | 127 | audio_osx_shutdown}; |
nkeynes@964 | 128 | |
nkeynes@1024 | 129 | AUDIO_DRIVER( "osx", audio_osx_driver ); |
.