Relax max MIDI msg size to 256 (for long sysex)
[ardour.git] / libs / backends / coreaudio / coreaudio_pcmio.cc
index b6105c9c12ea07fc129d52615e52fe49082225d6..480fa6f4243842f59c03fdf9963fe714e0cc5e78 100644 (file)
@@ -82,7 +82,7 @@ static OSStatus GetHardwarePropertyWrapper (AudioDevicePropertyID prop, UInt32*
        property_address.mElement = kAudioObjectPropertyElementMaster;
        return AudioObjectGetPropertyData(kAudioObjectSystemObject, &property_address, 0, NULL, size, d);
 #else
-       return AudioHardwareGetProperty (kAudioHardwarePropertyDevices, size, d);
+       return AudioHardwareGetProperty (prop, size, d);
 #endif
 }
 
@@ -184,11 +184,11 @@ static OSStatus render_callback_ptr (
                AudioUnitRenderActionFlags* ioActionFlags,
                const AudioTimeStamp* inTimeStamp,
                UInt32 inBusNumber,
-               UInt32 inNumberFrames,
+               UInt32 inNumberSamples,
                AudioBufferList* ioData)
 {
        CoreAudioPCM * d = static_cast<CoreAudioPCM*> (inRefCon);
-       return d->render_callback(ioActionFlags, inTimeStamp, inBusNumber, inNumberFrames, ioData);
+       return d->render_callback(ioActionFlags, inTimeStamp, inBusNumber, inNumberSamples, ioData);
 }
 
 
@@ -794,7 +794,7 @@ CoreAudioPCM::pcm_start (
 
        assert(_device_ids);
        std::string errorMsg;
-       _state = -2;
+       _state = -99;
 
        // "None" = UINT32_MAX
        if (device_id_out >= _n_devices && device_id_in >= _n_devices) {
@@ -822,30 +822,39 @@ CoreAudioPCM::pcm_start (
        AudioDeviceID device_id;
        AudioStreamBasicDescription srcFormat, dstFormat;
 
+#ifndef COREAUDIO_108
+       ComponentDescription cd = {kAudioUnitType_Output, kAudioUnitSubType_HALOutput, kAudioUnitManufacturer_Apple, 0, 0};
+       Component HALOutput = FindNextComponent(NULL, &cd);
+       if (!HALOutput) { errorMsg="FindNextComponent"; _state = -2; goto error; }
+
+       err = OpenAComponent(HALOutput, &_auhal);
+       if (err != noErr) { errorMsg="OpenAComponent"; _state = -2; goto error; }
+#else
        AudioComponentDescription cd = {kAudioUnitType_Output, kAudioUnitSubType_HALOutput, kAudioUnitManufacturer_Apple, 0, 0};
        AudioComponent HALOutput = AudioComponentFindNext(NULL, &cd);
-       if (!HALOutput) { errorMsg="AudioComponentFindNext"; goto error; }
+       if (!HALOutput) { errorMsg="AudioComponentFindNext"; _state = -2; goto error; }
 
        err = AudioComponentInstanceNew(HALOutput, &_auhal);
-       if (err != noErr) { errorMsg="AudioComponentInstanceNew"; goto error; }
+       if (err != noErr) { errorMsg="AudioComponentInstanceNew"; _state = -2; goto error; }
+#endif
 
        err = AudioUnitInitialize(_auhal);
-       if (err != noErr) { errorMsg="AudioUnitInitialize"; goto error; }
+       if (err != noErr) { errorMsg="AudioUnitInitialize"; _state = -3; goto error; }
 
        // explicitly change samplerate of the devices, TODO allow separate rates with aggregates
        if (set_device_sample_rate(device_id_in, sample_rate, true)) {
-               errorMsg="Failed to set SampleRate, Capture Device"; goto error;
+               errorMsg="Failed to set SampleRate, Capture Device"; _state = -4; goto error;
        }
        if (set_device_sample_rate(device_id_out, sample_rate, false)) {
-               errorMsg="Failed to set SampleRate, Playback Device"; goto error;
+               errorMsg="Failed to set SampleRate, Playback Device"; _state = -4; goto error;
        }
 
        // explicitly request device buffer size
        if (device_id_in < _n_devices && set_device_buffer_size_id(_device_ids[device_id_in], samples_per_period)) {
-               errorMsg="kAudioDevicePropertyBufferFrameSize, Input"; goto error;
+               errorMsg="kAudioDevicePropertyBufferFrameSize, Input"; _state = -5; goto error;
        }
        if (device_id_out < _n_devices && set_device_buffer_size_id(_device_ids[device_id_out], samples_per_period)) {
-               errorMsg="kAudioDevicePropertyBufferFrameSize, Output"; goto error;
+               errorMsg="kAudioDevicePropertyBufferFrameSize, Output"; _state = -5; goto error;
        }
 
        // create aggregate device..
@@ -855,7 +864,7 @@ CoreAudioPCM::pcm_start (
                } else {
                        _aggregate_device_id = 0;
                        _aggregate_plugin_id = 0;
-                       errorMsg="Cannot create Aggregate Device"; goto error;
+                       errorMsg="Cannot create Aggregate Device"; _state = -12; goto error;
                }
        } else if (device_id_out < _n_devices) {
                device_id = _device_ids[device_id_out];
@@ -871,14 +880,14 @@ CoreAudioPCM::pcm_start (
        // enableIO to progress further
        uint32val = (chn_in > 0) ? 1 : 0;
        err = AudioUnitSetProperty(_auhal, kAudioOutputUnitProperty_EnableIO, kAudioUnitScope_Input, AUHAL_INPUT_ELEMENT, &uint32val, sizeof(UInt32));
-       if (err != noErr) { errorMsg="kAudioOutputUnitProperty_EnableIO, Input"; goto error; }
+       if (err != noErr) { errorMsg="kAudioOutputUnitProperty_EnableIO, Input"; _state = -7; goto error; }
 
        uint32val = (chn_out > 0) ? 1 : 0;
        err = AudioUnitSetProperty(_auhal, kAudioOutputUnitProperty_EnableIO, kAudioUnitScope_Output, AUHAL_OUTPUT_ELEMENT, &uint32val, sizeof(UInt32));
-       if (err != noErr) { errorMsg="kAudioOutputUnitProperty_EnableIO, Output"; goto error; }
+       if (err != noErr) { errorMsg="kAudioOutputUnitProperty_EnableIO, Output"; _state = -7; goto error; }
 
        err = AudioUnitSetProperty(_auhal, kAudioOutputUnitProperty_CurrentDevice, kAudioUnitScope_Global, 0, &device_id, sizeof(AudioDeviceID));
-       if (err != noErr) { errorMsg="kAudioOutputUnitProperty_CurrentDevice, Input"; goto error; }
+       if (err != noErr) { errorMsg="kAudioOutputUnitProperty_CurrentDevice, Input"; _state = -7; goto error; }
 
        if (chn_in > 0) {
                // set sample format
@@ -892,10 +901,10 @@ CoreAudioPCM::pcm_start (
                srcFormat.mBitsPerChannel = 32;
 
                err = AudioUnitSetProperty(_auhal, kAudioUnitProperty_StreamFormat, kAudioUnitScope_Output, AUHAL_INPUT_ELEMENT, &srcFormat, sizeof(AudioStreamBasicDescription));
-               if (err != noErr) { errorMsg="kAudioUnitProperty_StreamFormat, Output"; goto error; }
+               if (err != noErr) { errorMsg="kAudioUnitProperty_StreamFormat, Output"; _state = -6; goto error; }
 
                err = AudioUnitSetProperty(_auhal, kAudioUnitProperty_MaximumFramesPerSlice, kAudioUnitScope_Global, AUHAL_INPUT_ELEMENT, (UInt32*)&_samples_per_period, sizeof(UInt32));
-               if (err != noErr) { errorMsg="kAudioUnitProperty_MaximumFramesPerSlice, Input"; goto error; }
+               if (err != noErr) { errorMsg="kAudioUnitProperty_MaximumFramesPerSlice, Input"; _state = -6; goto error; }
        }
 
        if (chn_out > 0) {
@@ -909,17 +918,17 @@ CoreAudioPCM::pcm_start (
                dstFormat.mBitsPerChannel = 32;
 
                err = AudioUnitSetProperty(_auhal, kAudioUnitProperty_StreamFormat, kAudioUnitScope_Input, AUHAL_OUTPUT_ELEMENT, &dstFormat, sizeof(AudioStreamBasicDescription));
-               if (err != noErr) { errorMsg="kAudioUnitProperty_StreamFormat Input"; goto error; }
+               if (err != noErr) { errorMsg="kAudioUnitProperty_StreamFormat Input"; _state = -5; goto error; }
 
                err = AudioUnitSetProperty(_auhal, kAudioUnitProperty_MaximumFramesPerSlice, kAudioUnitScope_Global, AUHAL_OUTPUT_ELEMENT, (UInt32*)&_samples_per_period, sizeof(UInt32));
-               if (err != noErr) { errorMsg="kAudioUnitProperty_MaximumFramesPerSlice, Output"; goto error; }
+               if (err != noErr) { errorMsg="kAudioUnitProperty_MaximumFramesPerSlice, Output"; _state = -5; goto error; }
        }
 
        /* read back stream descriptions */
        if (chn_in > 0) {
                size = sizeof(AudioStreamBasicDescription);
                err = AudioUnitGetProperty(_auhal, kAudioUnitProperty_StreamFormat, kAudioUnitScope_Output, AUHAL_INPUT_ELEMENT, &srcFormat, &size);
-               if (err != noErr) { errorMsg="Get kAudioUnitProperty_StreamFormat, Output"; goto error; }
+               if (err != noErr) { errorMsg="Get kAudioUnitProperty_StreamFormat, Output"; _state = -5; goto error; }
                _capture_channels = srcFormat.mChannelsPerFrame;
 #ifndef NDEBUG
                PrintStreamDesc(&srcFormat);
@@ -929,7 +938,7 @@ CoreAudioPCM::pcm_start (
        if (chn_out > 0) {
                size = sizeof(AudioStreamBasicDescription);
                err = AudioUnitGetProperty(_auhal, kAudioUnitProperty_StreamFormat, kAudioUnitScope_Input, AUHAL_OUTPUT_ELEMENT, &dstFormat, &size);
-               if (err != noErr) { errorMsg="Get kAudioUnitProperty_StreamFormat, Input"; goto error; }
+               if (err != noErr) { errorMsg="Get kAudioUnitProperty_StreamFormat, Input"; _state = -5; goto error; }
                _playback_channels = dstFormat.mChannelsPerFrame;
 
 #ifndef NDEBUG
@@ -941,20 +950,20 @@ CoreAudioPCM::pcm_start (
        if (_capture_channels > 0) {
                _input_audio_buffer_list = (AudioBufferList*)malloc(sizeof(AudioBufferList) + (_capture_channels - 1) * sizeof(AudioBuffer));
                assert(_input_audio_buffer_list);
-               if (!_input_audio_buffer_list) { errorMsg="Out of Memory."; goto error; }
+               if (!_input_audio_buffer_list) { errorMsg="Out of Memory."; _state = -8; goto error; }
        }
 
        _active_device_id = device_id;
 
        // add Listeners
        err = add_listener (_active_device_id, kAudioDeviceProcessorOverload, this);
-       if (err != noErr) { errorMsg="kAudioDeviceProcessorOverload, Listen"; goto error; }
+       if (err != noErr) { errorMsg="kAudioDeviceProcessorOverload, Listen"; _state = -9; goto error; }
 
        err = add_listener (_active_device_id, kAudioDevicePropertyBufferFrameSize, this);
-       if (err != noErr) { errorMsg="kAudioDevicePropertyBufferFrameSize, Listen"; goto error; }
+       if (err != noErr) { errorMsg="kAudioDevicePropertyBufferFrameSize, Listen"; _state = -9; goto error; }
 
        err = add_listener (_active_device_id, kAudioDevicePropertyNominalSampleRate, this);
-       if (err != noErr) { errorMsg="kAudioDevicePropertyBufferFrameSize, Listen"; goto error; }
+       if (err != noErr) { errorMsg="kAudioDevicePropertyNominalSampleRate, Listen"; _state = -9; goto error; }
 
        _samples_per_period = current_buffer_size_id(_active_device_id);
 
@@ -975,7 +984,7 @@ CoreAudioPCM::pcm_start (
                                &renderCallback, sizeof (renderCallback));
        }
 
-       if (err != noErr) { errorMsg="kAudioUnitProperty_SetRenderCallback"; goto error; }
+       if (err != noErr) { errorMsg="kAudioUnitProperty_SetRenderCallback"; _state = -10; goto error; }
 
        /* setup complete, now get going.. */
        if (AudioOutputUnitStart(_auhal) == noErr) {
@@ -988,17 +997,17 @@ CoreAudioPCM::pcm_start (
 
                // kick device
                if (set_device_buffer_size_id(_active_device_id, samples_per_period)) {
-                       errorMsg="kAudioDevicePropertyBufferFrameSize"; goto error;
+                       errorMsg="kAudioDevicePropertyBufferFrameSize"; _state = -11; goto error;
                }
 
                return 0;
        }
 
 error:
+       assert (_state != 0);
        char *rv = (char*)&err;
        fprintf(stderr, "CoreaudioPCM Error: %c%c%c%c %s\n", rv[0], rv[1], rv[2], rv[3], errorMsg.c_str());
        pcm_stop();
-       _state = -3;
        _active_device_id = 0;
        pthread_mutex_unlock (&_discovery_lock);
        return -1;
@@ -1102,19 +1111,19 @@ CoreAudioPCM::render_callback (
                AudioUnitRenderActionFlags* ioActionFlags,
                const AudioTimeStamp* inTimeStamp,
                UInt32 inBusNumber,
-               UInt32 inNumberFrames,
+               UInt32 inNumberSamples,
                AudioBufferList* ioData)
 {
        OSStatus retVal = kAudioHardwareNoError;
 
-       if (_samples_per_period < inNumberFrames) {
+       if (_samples_per_period < inNumberSamples) {
 #ifndef NDEBUG
                printf("samples per period exceeds configured value, cycle skipped (%u < %u)\n",
-                               (unsigned int)_samples_per_period, (unsigned int)inNumberFrames);
+                               (unsigned int)_samples_per_period, (unsigned int)inNumberSamples);
 #endif
                for (uint32_t i = 0; _playback_channels > 0 && i < ioData->mNumberBuffers; ++i) {
                        float* ob = (float*) ioData->mBuffers[i].mData;
-                       memset(ob, 0, sizeof(float) * inNumberFrames);
+                       memset(ob, 0, sizeof(float) * inNumberSamples);
                }
                return noErr;
        }
@@ -1122,17 +1131,17 @@ CoreAudioPCM::render_callback (
        assert(_playback_channels == 0 || ioData->mNumberBuffers == _playback_channels);
 
        UInt64 cur_cycle_start = AudioGetCurrentHostTime ();
-       _cur_samples_per_period = inNumberFrames;
+       _cur_samples_per_period = inNumberSamples;
 
        if (_capture_channels > 0) {
                _input_audio_buffer_list->mNumberBuffers = _capture_channels;
                for (uint32_t i = 0; i < _capture_channels; ++i) {
                        _input_audio_buffer_list->mBuffers[i].mNumberChannels = 1;
-                       _input_audio_buffer_list->mBuffers[i].mDataByteSize = inNumberFrames * sizeof(float);
+                       _input_audio_buffer_list->mBuffers[i].mDataByteSize = inNumberSamples * sizeof(float);
                        _input_audio_buffer_list->mBuffers[i].mData = NULL;
                }
 
-               retVal = AudioUnitRender(_auhal, ioActionFlags, inTimeStamp, AUHAL_INPUT_ELEMENT, inNumberFrames, _input_audio_buffer_list);
+               retVal = AudioUnitRender(_auhal, ioActionFlags, inTimeStamp, AUHAL_INPUT_ELEMENT, inNumberSamples, _input_audio_buffer_list);
        }
 
        if (retVal != kAudioHardwareNoError) {
@@ -1153,7 +1162,7 @@ CoreAudioPCM::render_callback (
        int rv = -1;
 
        if (_process_callback) {
-               rv = _process_callback(_process_arg, inNumberFrames, cur_cycle_start);
+               rv = _process_callback(_process_arg, inNumberSamples, cur_cycle_start);
        }
 
        _in_process = false;
@@ -1162,7 +1171,7 @@ CoreAudioPCM::render_callback (
                // clear output
                for (uint32_t i = 0; i < ioData->mNumberBuffers; ++i) {
                        float* ob = (float*) ioData->mBuffers[i].mData;
-                       memset(ob, 0, sizeof(float) * inNumberFrames);
+                       memset(ob, 0, sizeof(float) * inNumberSamples);
                }
        }
        return noErr;