13
0

AU: request offline processing

This commit is contained in:
Robin Gareus 2024-08-15 17:52:48 +02:00
parent 35cb60c2dc
commit 8c4819e588
Signed by: rgareus
GPG Key ID: A090BCE02CF57F04
2 changed files with 35 additions and 0 deletions

View File

@ -81,6 +81,7 @@ class LIBARDOUR_API AUPlugin : public ARDOUR::Plugin
void deactivate (); void deactivate ();
void flush (); void flush ();
int set_block_size (pframes_t nframes); int set_block_size (pframes_t nframes);
void set_non_realtime (bool);
int connect_and_run (BufferSet& bufs, int connect_and_run (BufferSet& bufs,
samplepos_t start, samplepos_t end, double speed, samplepos_t start, samplepos_t end, double speed,
@ -166,6 +167,7 @@ class LIBARDOUR_API AUPlugin : public ARDOUR::Plugin
std::shared_ptr<CAAudioUnit> unit; std::shared_ptr<CAAudioUnit> unit;
bool initialized; bool initialized;
bool process_offline;
int32_t input_channels; int32_t input_channels;
int32_t output_channels; int32_t output_channels;
std::vector<std::pair<int,int> > io_configs; std::vector<std::pair<int,int> > io_configs;

View File

@ -360,6 +360,7 @@ AUPlugin::AUPlugin (AudioEngine& engine, Session& session, std::shared_ptr<CACom
, comp (_comp) , comp (_comp)
, unit (new CAAudioUnit) , unit (new CAAudioUnit)
, initialized (false) , initialized (false)
, process_offline (false)
, _last_nframes (0) , _last_nframes (0)
, _requires_fixed_size_buffers (false) , _requires_fixed_size_buffers (false)
, buffers (0) , buffers (0)
@ -401,6 +402,7 @@ AUPlugin::AUPlugin (const AUPlugin& other)
, comp (other.get_comp()) , comp (other.get_comp())
, unit (new CAAudioUnit) , unit (new CAAudioUnit)
, initialized (false) , initialized (false)
, process_offline (false)
, _last_nframes (0) , _last_nframes (0)
, _requires_fixed_size_buffers (false) , _requires_fixed_size_buffers (false)
, buffers (0) , buffers (0)
@ -869,6 +871,33 @@ AUPlugin::requires_fixed_size_buffers() const
return _requires_fixed_size_buffers; return _requires_fixed_size_buffers;
} }
void
AUPlugin::set_non_realtime (bool yn)
{
if (process_offline == yn) {
return;
}
process_offline = yn;
bool was_initialized = initialized;
if (initialized) {
deactivate ();
}
OSErr err;
UInt32 isOffline = yn ? 1 : 0;
if ((err = unit->SetProperty (/*kAudioUnitProperty_OfflineRender*/ 37, kAudioUnitScope_Global, 0, &isOffline, sizeof (isOffline))) != noErr) {
info << string_compose (_("AU: cannot set offline rendering(err = %1)"), err) << endmsg;
}
if (yn) {
UInt32 numSamples = _session.get_block_size();
unit->SetProperty (/*kAudioUnitOfflineProperty_InputSize*/ 3020, kAudioUnitScope_Global, 0, &numSamples, sizeof(numSamples));
}
if (was_initialized) {
activate ();
}
}
int int
AUPlugin::set_block_size (pframes_t nframes) AUPlugin::set_block_size (pframes_t nframes)
@ -888,6 +917,10 @@ AUPlugin::set_block_size (pframes_t nframes)
return -1; return -1;
} }
if (process_offline) {
unit->SetProperty (/*kAudioUnitOfflineProperty_InputSize*/ 3020, kAudioUnitScope_Global, 0, &numSamples, sizeof(numSamples));
}
if (was_initialized) { if (was_initialized) {
activate (); activate ();
} }