Search
lxdream.org :: lxdream/src/drivers/audio_osx.m
lxdream 0.9.1
released Jun 29
Download Now
filename src/drivers/audio_osx.m
changeset 1024:c67f2d61ab97
prev964:f2f3c7612d06
author nkeynes
date Sat Jun 13 00:50:48 2009 +0000 (14 years ago)
permissions -rw-r--r--
last change Build drivers with library dependencies as shared objects (ie plugins)
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 );
.