Files
test/extern/audaspace/plugins/coreaudio/CoreAudioDevice.h
Jörg Müller 57117497fe Audaspace: Synchronizer API change
Removes the playback handle from the synchronizer API and integrates it
into the device, removing the ISynchronizer interface completely.

This has been discussed in more detail in #126047 and its main purpose is to unify the handling of synchronizer events, especially seek which needed different logic for jack vs other backends.

OpenAL now needs a silence playback handle for synchronization but all
other backends are pretty straightforward just counting the mixed
samples in the SoftwareDevice with some specializations for specific
backends that had their own synchronizers before.

Note: CoreAudio changes are untested as I don't have a Mac.

Pull Request: https://projects.blender.org/blender/blender/pulls/133191
2025-04-01 11:28:08 +02:00

104 lines
2.8 KiB
C++

/*******************************************************************************
* Copyright 2009-2021 Jörg Müller
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
******************************************************************************/
#pragma once
#ifdef COREAUDIO_PLUGIN
#define AUD_BUILD_PLUGIN
#endif
/**
* @file CoreAudioDevice.h
* @ingroup plugin
* The CoreAudioDevice class.
*/
#include <memory>
#include <AudioToolbox/CoreAudioClock.h>
#include <AudioUnit/AudioUnit.h>
#include "devices/OpenCloseDevice.h"
AUD_NAMESPACE_BEGIN
/**
* This device plays back through CoreAudio, the Apple audio API.
*/
class AUD_PLUGIN_API CoreAudioDevice : public OpenCloseDevice
{
private:
/**
* Whether there is currently playback.
*/
bool m_playback;
/**
* The CoreAudio AudioUnit.
*/
AudioUnit m_audio_unit;
/// The CoreAudio clock referene.
CAClockRef m_clock_ref;
/**
* Mixes the next bytes into the buffer.
* \param data The CoreAudio device.
* \param flags Unused flags.
* \param time_stamp Unused time stamp.
* \param bus_number Unused bus number.
* \param number_frames Unused number of frames.
* \param buffer_list The list of buffers to be filled.
*/
AUD_LOCAL static OSStatus CoreAudio_mix(void* data, AudioUnitRenderActionFlags* flags, const AudioTimeStamp* time_stamp, UInt32 bus_number, UInt32 number_frames, AudioBufferList* buffer_list);
AUD_LOCAL void start();
AUD_LOCAL void stop();
AUD_LOCAL void open();
AUD_LOCAL void close();
// delete copy constructor and operator=
CoreAudioDevice(const CoreAudioDevice&) = delete;
CoreAudioDevice& operator=(const CoreAudioDevice&) = delete;
public:
/**
* Opens the CoreAudio audio device for playback.
* \param specs The wanted audio specification.
* \param buffersize The size of the internal buffer.
* \note The specification really used for opening the device may differ.
* \exception Exception Thrown if the audio device cannot be opened.
*/
CoreAudioDevice(DeviceSpecs specs, int buffersize = AUD_DEFAULT_BUFFER_SIZE);
/**
* Closes the CoreAudio audio device.
*/
virtual ~CoreAudioDevice();
virtual void seekSynchronizer(double time);
virtual double getSynchronizerPosition();
virtual void playSynchronizer();
virtual void stopSynchronizer();
/**
* Registers this plugin.
*/
static void registerPlugin();
};
AUD_NAMESPACE_END