style: unify identifier naming per updated conventions
Automated with clang-tidy readability-identifier-naming (config added to .clang-tidy) plus scripted passes, per the updated rules now documented in CONTRIBUTING.md: - types (class/struct/enum/alias/template params): PascalCase - functions, variables, members: snake_case (incl. rational -> Rational) - private/protected members: trailing underscore; static member variables likewise (instance_, available_themes_) - constants and enum values: snake_case (kLinear -> k_linear, F32P -> f32p); ALL_CAPS reserved for macros - macros: OAK_ prefix (OLIVE_ADD_TEST/OLIVE_ASSERT/OLIVE_CONFIG -> OAK_ADD_TEST/OAK_ASSERT/OAK_CONFIG, GL_PREAMBLE -> OAK_GL_PREAMBLE, include guards -> OAK_*) - file names: all lowercase (Current/Plugin/OliveHost/OliveClip/ OlivePluginInstance -> current/plugin/olivehost/oliveclip/ oliveplugininstance) - getters share the member name sans underscore, setters set_foo() - Qt and third-party (OpenFX) virtual overrides and framework callbacks keep their original names (exempt in .clang-tidy) Manual follow-ups required where automation could not reach: - string-based QMetaObject/SIGNAL/SLOT references updated to renamed methods (AddTask, CreatedFile, DeleteSpecificFile, moveSelectionUp, ...) - macro bodies referencing renamed methods (OLIVE_CONFIG, NODE_DEFAULT_DESTRUCTOR, MANAGEDDISPLAYWIDGET_*) - self-shadowing locals renamed where signals/methods became same-named (size_changed, worker_count, selected_items, import param, filters) - third_party OFX member/namespace usages restored (OFX::Host::*, _created, _clipPrefsDirty, createInstance, clearPersistentMessage) - STL protocol aliases restored (const_iterator) with .clang-tidy ignore rules; qHash overloads restored Full build and test suite pass: ctest 4/4, ~1960 gtest cases green.
This commit is contained in:
@@ -29,7 +29,7 @@ namespace olive
|
||||
{
|
||||
|
||||
AudioLevelMeter::Stats
|
||||
AudioLevelMeter::AnalyzeSampleBuffer(const core::SampleBuffer &samples)
|
||||
AudioLevelMeter::analyze_sample_buffer(const core::SampleBuffer &samples)
|
||||
{
|
||||
Stats stats;
|
||||
|
||||
@@ -63,9 +63,9 @@ AudioLevelMeter::AnalyzeSampleBuffer(const core::SampleBuffer &samples)
|
||||
|
||||
ChannelStats channel_stats;
|
||||
channel_stats.peak_linear = peak;
|
||||
channel_stats.peak_db = LinearToDb(peak);
|
||||
channel_stats.peak_db = linear_to_db(peak);
|
||||
channel_stats.rms_linear = rms;
|
||||
channel_stats.rms_db = LinearToDb(rms);
|
||||
channel_stats.rms_db = linear_to_db(rms);
|
||||
channel_stats.vu_db = channel_stats.rms_db;
|
||||
stats.channels[channel] = channel_stats;
|
||||
|
||||
@@ -76,24 +76,24 @@ AudioLevelMeter::AnalyzeSampleBuffer(const core::SampleBuffer &samples)
|
||||
|
||||
stats.silence = qFuzzyIsNull(stats.max_peak_linear);
|
||||
stats.integrated_lufs =
|
||||
PowerToLufs(total_square / static_cast<double>(total_samples));
|
||||
power_to_lufs(total_square / static_cast<double>(total_samples));
|
||||
|
||||
return stats;
|
||||
}
|
||||
|
||||
double AudioLevelMeter::LinearToDb(double linear)
|
||||
double AudioLevelMeter::linear_to_db(double linear)
|
||||
{
|
||||
if (linear <= 0.0) {
|
||||
return Decibel::MINIMUM;
|
||||
return Decibel::minimum;
|
||||
}
|
||||
|
||||
return Decibel::fromLinear(linear);
|
||||
return Decibel::from_linear(linear);
|
||||
}
|
||||
|
||||
double AudioLevelMeter::PowerToLufs(double mean_square)
|
||||
double AudioLevelMeter::power_to_lufs(double mean_square)
|
||||
{
|
||||
if (mean_square <= 0.0) {
|
||||
return Decibel::MINIMUM;
|
||||
return Decibel::minimum;
|
||||
}
|
||||
|
||||
// BS.1770 loudness uses K-weighted mean square. This first pass stores the
|
||||
|
||||
@@ -18,8 +18,8 @@
|
||||
|
||||
***/
|
||||
|
||||
#ifndef AUDIOLEVELMETER_H
|
||||
#define AUDIOLEVELMETER_H
|
||||
#ifndef OAK_AUDIOLEVELMETER_H
|
||||
#define OAK_AUDIOLEVELMETER_H
|
||||
|
||||
#include <QVector>
|
||||
|
||||
@@ -45,13 +45,13 @@ public:
|
||||
bool silence = true;
|
||||
};
|
||||
|
||||
static Stats AnalyzeSampleBuffer(const core::SampleBuffer &samples);
|
||||
static Stats analyze_sample_buffer(const core::SampleBuffer &samples);
|
||||
|
||||
private:
|
||||
static double LinearToDb(double linear);
|
||||
static double PowerToLufs(double mean_square);
|
||||
static double linear_to_db(double linear);
|
||||
static double power_to_lufs(double mean_square);
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
#endif // AUDIOLEVELMETER_H
|
||||
#endif // OAK_AUDIOLEVELMETER_H
|
||||
|
||||
+68
-68
@@ -34,14 +34,14 @@ namespace olive
|
||||
|
||||
AudioManager *AudioManager::instance_ = nullptr;
|
||||
|
||||
void AudioManager::CreateInstance()
|
||||
void AudioManager::create_instance()
|
||||
{
|
||||
if (instance_ == nullptr) {
|
||||
instance_ = new AudioManager();
|
||||
}
|
||||
}
|
||||
|
||||
void AudioManager::DestroyInstance()
|
||||
void AudioManager::destroy_instance()
|
||||
{
|
||||
delete instance_;
|
||||
instance_ = nullptr;
|
||||
@@ -52,18 +52,18 @@ AudioManager *AudioManager::instance()
|
||||
return instance_;
|
||||
}
|
||||
|
||||
void AudioManager::SetOutputNotifyInterval(int n)
|
||||
void AudioManager::set_output_notify_interval(int n)
|
||||
{
|
||||
output_buffer_->set_notify_interval(n);
|
||||
}
|
||||
|
||||
int OutputCallback(const void *input, void *output, unsigned long frameCount,
|
||||
const PaStreamCallbackTimeInfo *timeInfo,
|
||||
PaStreamCallbackFlags statusFlags, void *userData)
|
||||
int output_callback(const void *input, void *output, unsigned long frame_count,
|
||||
const PaStreamCallbackTimeInfo *time_info,
|
||||
PaStreamCallbackFlags status_flags, void *user_data)
|
||||
{
|
||||
PreviewAudioDevice *device = static_cast<PreviewAudioDevice *>(userData);
|
||||
PreviewAudioDevice *device = static_cast<PreviewAudioDevice *>(user_data);
|
||||
|
||||
qint64 max_read = frameCount * device->bytes_per_frame();
|
||||
qint64 max_read = frame_count * device->bytes_per_frame();
|
||||
qint64 read_count =
|
||||
device->read(reinterpret_cast<char *>(output), max_read);
|
||||
if (read_count < max_read) {
|
||||
@@ -74,23 +74,23 @@ int OutputCallback(const void *input, void *output, unsigned long frameCount,
|
||||
return paContinue;
|
||||
}
|
||||
|
||||
int InputCallback(const void *input, void *output, unsigned long frameCount,
|
||||
const PaStreamCallbackTimeInfo *timeInfo,
|
||||
PaStreamCallbackFlags statusFlags, void *userData)
|
||||
int input_callback(const void *input, void *output, unsigned long frame_count,
|
||||
const PaStreamCallbackTimeInfo *time_info,
|
||||
PaStreamCallbackFlags status_flags, void *user_data)
|
||||
{
|
||||
FFmpegEncoder *f = static_cast<FFmpegEncoder *>(userData);
|
||||
FFmpegEncoder *f = static_cast<FFmpegEncoder *>(user_data);
|
||||
|
||||
AudioParams our_params = f->params().audio_params();
|
||||
our_params.set_format(
|
||||
f->params().audio_params().format().to_packed_equivalent());
|
||||
|
||||
f->WriteAudioData(our_params, reinterpret_cast<const uint8_t **>(&input),
|
||||
frameCount);
|
||||
f->write_audio_data(our_params, reinterpret_cast<const uint8_t **>(&input),
|
||||
frame_count);
|
||||
|
||||
return paContinue;
|
||||
}
|
||||
|
||||
bool AudioManager::PushToOutput(const AudioParams ¶ms,
|
||||
bool AudioManager::push_to_output(const AudioParams ¶ms,
|
||||
const QByteArray &samples, QString *error)
|
||||
{
|
||||
if (output_device_ == paNoDevice) {
|
||||
@@ -102,14 +102,14 @@ bool AudioManager::PushToOutput(const AudioParams ¶ms,
|
||||
if (output_params_ != params || output_stream_ == nullptr) {
|
||||
output_params_ = params;
|
||||
|
||||
CloseOutputStream();
|
||||
close_output_stream();
|
||||
|
||||
PaStreamParameters p = GetPortAudioParams(params, output_device_);
|
||||
PaStreamParameters p = get_port_audio_params(params, output_device_);
|
||||
|
||||
PaError r = Pa_OpenStream(&output_stream_, nullptr, &p,
|
||||
output_params_.sample_rate(),
|
||||
paFramesPerBufferUnspecified, paNoFlag,
|
||||
OutputCallback, output_buffer_);
|
||||
output_callback, output_buffer_);
|
||||
if (r != paNoError) {
|
||||
// Unhandled error
|
||||
//qCritical() << "Failed to open output stream:" << Pa_GetErrorText(r);
|
||||
@@ -136,59 +136,59 @@ bool AudioManager::PushToOutput(const AudioParams ¶ms,
|
||||
return true;
|
||||
}
|
||||
|
||||
void AudioManager::ClearBufferedOutput()
|
||||
void AudioManager::clear_buffered_output()
|
||||
{
|
||||
output_buffer_->clear();
|
||||
}
|
||||
|
||||
PaSampleFormat AudioManager::GetPortAudioSampleFormat(SampleFormat fmt)
|
||||
PaSampleFormat AudioManager::get_port_audio_sample_format(SampleFormat fmt)
|
||||
{
|
||||
switch (fmt) {
|
||||
case SampleFormat::U8:
|
||||
case SampleFormat::U8P:
|
||||
case SampleFormat::u8:
|
||||
case SampleFormat::u8_p:
|
||||
return paUInt8;
|
||||
case SampleFormat::S16:
|
||||
case SampleFormat::S16P:
|
||||
case SampleFormat::s16:
|
||||
case SampleFormat::s16_p:
|
||||
return paInt16;
|
||||
case SampleFormat::S32:
|
||||
case SampleFormat::S32P:
|
||||
case SampleFormat::s32:
|
||||
case SampleFormat::s32_p:
|
||||
return paInt32;
|
||||
case SampleFormat::F32:
|
||||
case SampleFormat::F32P:
|
||||
case SampleFormat::f32:
|
||||
case SampleFormat::f32_p:
|
||||
return paFloat32;
|
||||
case SampleFormat::S64:
|
||||
case SampleFormat::S64P:
|
||||
case SampleFormat::F64:
|
||||
case SampleFormat::F64P:
|
||||
case SampleFormat::INVALID:
|
||||
case SampleFormat::COUNT:
|
||||
case SampleFormat::s64:
|
||||
case SampleFormat::s64_p:
|
||||
case SampleFormat::f64:
|
||||
case SampleFormat::f64_p:
|
||||
case SampleFormat::invalid:
|
||||
case SampleFormat::count:
|
||||
break;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
void AudioManager::CloseOutputStream()
|
||||
void AudioManager::close_output_stream()
|
||||
{
|
||||
if (output_stream_) {
|
||||
if (Pa_IsStreamActive(output_stream_)) {
|
||||
StopOutput();
|
||||
stop_output();
|
||||
}
|
||||
Pa_CloseStream(output_stream_);
|
||||
output_stream_ = nullptr;
|
||||
}
|
||||
}
|
||||
|
||||
void AudioManager::StopOutput()
|
||||
void AudioManager::stop_output()
|
||||
{
|
||||
// Abort the stream so playback stops immediately
|
||||
if (output_stream_) {
|
||||
Pa_AbortStream(output_stream_);
|
||||
ClearBufferedOutput();
|
||||
clear_buffered_output();
|
||||
}
|
||||
}
|
||||
|
||||
void AudioManager::SetOutputDevice(PaDeviceIndex device)
|
||||
void AudioManager::set_output_device(PaDeviceIndex device)
|
||||
{
|
||||
if (device == paNoDevice) {
|
||||
qInfo() << "No output device found";
|
||||
@@ -201,12 +201,12 @@ void AudioManager::SetOutputDevice(PaDeviceIndex device)
|
||||
|
||||
output_device_ = device;
|
||||
|
||||
CloseOutputStream();
|
||||
close_output_stream();
|
||||
|
||||
emit OutputParamsChanged();
|
||||
emit output_params_changed();
|
||||
}
|
||||
|
||||
void AudioManager::SetInputDevice(PaDeviceIndex device)
|
||||
void AudioManager::set_input_device(PaDeviceIndex device)
|
||||
{
|
||||
if (device == paNoDevice) {
|
||||
qInfo() << "No input device found";
|
||||
@@ -220,14 +220,14 @@ void AudioManager::SetInputDevice(PaDeviceIndex device)
|
||||
input_device_ = device;
|
||||
}
|
||||
|
||||
void AudioManager::HardReset()
|
||||
void AudioManager::hard_reset()
|
||||
{
|
||||
CloseOutputStream();
|
||||
close_output_stream();
|
||||
Pa_Terminate();
|
||||
Pa_Initialize();
|
||||
}
|
||||
|
||||
bool AudioManager::StartRecording(const EncodingParams ¶ms,
|
||||
bool AudioManager::start_recording(const EncodingParams ¶ms,
|
||||
QString *error_str)
|
||||
{
|
||||
if (input_device_ == paNoDevice) {
|
||||
@@ -235,18 +235,18 @@ bool AudioManager::StartRecording(const EncodingParams ¶ms,
|
||||
}
|
||||
|
||||
input_encoder_ = new FFmpegEncoder(params);
|
||||
if (!input_encoder_->Open()) {
|
||||
if (!input_encoder_->open()) {
|
||||
qCritical() << "Failed to open encoder for recording";
|
||||
return false;
|
||||
}
|
||||
|
||||
PaStreamParameters p =
|
||||
GetPortAudioParams(params.audio_params(), input_device_);
|
||||
get_port_audio_params(params.audio_params(), input_device_);
|
||||
|
||||
PaError r = Pa_OpenStream(&input_stream_, &p, nullptr,
|
||||
params.audio_params().sample_rate(),
|
||||
paFramesPerBufferUnspecified, paNoFlag,
|
||||
InputCallback, input_encoder_);
|
||||
input_callback, input_encoder_);
|
||||
if (r == paNoError) {
|
||||
//const PaStreamInfo* info = Pa_GetStreamInfo(input_stream_);
|
||||
r = Pa_StartStream(input_stream_);
|
||||
@@ -259,11 +259,11 @@ bool AudioManager::StartRecording(const EncodingParams ¶ms,
|
||||
*error_str = Pa_GetErrorText(r);
|
||||
}
|
||||
|
||||
StopRecording();
|
||||
stop_recording();
|
||||
return false;
|
||||
}
|
||||
|
||||
void AudioManager::StopRecording()
|
||||
void AudioManager::stop_recording()
|
||||
{
|
||||
if (input_stream_) {
|
||||
if (Pa_IsStreamActive(input_stream_)) {
|
||||
@@ -275,14 +275,14 @@ void AudioManager::StopRecording()
|
||||
}
|
||||
|
||||
if (input_encoder_) {
|
||||
input_encoder_->Close();
|
||||
input_encoder_->close();
|
||||
delete input_encoder_;
|
||||
input_encoder_ = nullptr;
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef Q_OS_LINUX
|
||||
static bool IsPreferredLinuxAudioHostApi(const PaHostApiInfo *info)
|
||||
static bool is_preferred_linux_audio_host_api(const PaHostApiInfo *info)
|
||||
{
|
||||
if (!info) {
|
||||
return false;
|
||||
@@ -294,7 +294,7 @@ static bool IsPreferredLinuxAudioHostApi(const PaHostApiInfo *info)
|
||||
name.contains(QStringLiteral("PulseAudio"), Qt::CaseInsensitive);
|
||||
}
|
||||
|
||||
static PaDeviceIndex GetPreferredLinuxAudioDevice(bool is_output_device)
|
||||
static PaDeviceIndex get_preferred_linux_audio_device(bool is_output_device)
|
||||
{
|
||||
// Prefer sound servers that provide mixing and desktop integration
|
||||
// (PipeWire, JACK, PulseAudio) over plain ALSA defaults, which often
|
||||
@@ -328,16 +328,16 @@ static PaDeviceIndex GetPreferredLinuxAudioDevice(bool is_output_device)
|
||||
}
|
||||
#endif
|
||||
|
||||
PaDeviceIndex AudioManager::FindConfigDeviceByName(bool is_output_device)
|
||||
PaDeviceIndex AudioManager::find_config_device_by_name(bool is_output_device)
|
||||
{
|
||||
QString entry = is_output_device ? QStringLiteral("AudioOutput") :
|
||||
QStringLiteral("AudioInput");
|
||||
|
||||
return FindDeviceByName(OLIVE_CONFIG_STR(entry).toString(),
|
||||
return find_device_by_name(OAK_CONFIG_STR(entry).toString(),
|
||||
is_output_device);
|
||||
}
|
||||
|
||||
PaDeviceIndex AudioManager::FindDeviceByName(const QString &s,
|
||||
PaDeviceIndex AudioManager::find_device_by_name(const QString &s,
|
||||
bool is_output_device)
|
||||
{
|
||||
PaDeviceIndex exact_match = paNoDevice;
|
||||
@@ -367,7 +367,7 @@ PaDeviceIndex AudioManager::FindDeviceByName(const QString &s,
|
||||
if (matched_info) {
|
||||
const PaHostApiInfo *host_api =
|
||||
Pa_GetHostApiInfo(matched_info->hostApi);
|
||||
if (IsPreferredLinuxAudioHostApi(host_api)) {
|
||||
if (is_preferred_linux_audio_host_api(host_api)) {
|
||||
// Keep an explicit choice that already uses a preferred API.
|
||||
return exact_match;
|
||||
}
|
||||
@@ -375,7 +375,7 @@ PaDeviceIndex AudioManager::FindDeviceByName(const QString &s,
|
||||
// Upgrade a non-preferred (e.g. ALSA) match to a preferred backend
|
||||
// when one is available.
|
||||
PaDeviceIndex preferred =
|
||||
GetPreferredLinuxAudioDevice(is_output_device);
|
||||
get_preferred_linux_audio_device(is_output_device);
|
||||
if (preferred != paNoDevice) {
|
||||
qInfo() << "Overriding saved audio device" << s
|
||||
<< "with preferred Linux audio device"
|
||||
@@ -388,7 +388,7 @@ PaDeviceIndex AudioManager::FindDeviceByName(const QString &s,
|
||||
}
|
||||
}
|
||||
|
||||
return GetPreferredLinuxAudioDevice(is_output_device);
|
||||
return get_preferred_linux_audio_device(is_output_device);
|
||||
#else
|
||||
if (exact_match != paNoDevice) {
|
||||
return exact_match;
|
||||
@@ -399,7 +399,7 @@ PaDeviceIndex AudioManager::FindDeviceByName(const QString &s,
|
||||
#endif
|
||||
}
|
||||
|
||||
PaStreamParameters AudioManager::GetPortAudioParams(const AudioParams ¶ms,
|
||||
PaStreamParameters AudioManager::get_port_audio_params(const AudioParams ¶ms,
|
||||
PaDeviceIndex device)
|
||||
{
|
||||
PaStreamParameters p;
|
||||
@@ -407,7 +407,7 @@ PaStreamParameters AudioManager::GetPortAudioParams(const AudioParams ¶ms,
|
||||
p.channelCount = params.channel_count();
|
||||
p.device = device;
|
||||
p.hostApiSpecificStreamInfo = nullptr;
|
||||
p.sampleFormat = GetPortAudioSampleFormat(params.format());
|
||||
p.sampleFormat = get_port_audio_sample_format(params.format());
|
||||
|
||||
if (device >= 0 && device < Pa_GetDeviceCount()) {
|
||||
p.suggestedLatency = Pa_GetDeviceInfo(device)->defaultLowOutputLatency;
|
||||
@@ -432,24 +432,24 @@ AudioManager::AudioManager()
|
||||
Pa_Initialize();
|
||||
|
||||
// Get device from config
|
||||
PaDeviceIndex output_device = FindConfigDeviceByName(true);
|
||||
PaDeviceIndex input_device = FindConfigDeviceByName(false);
|
||||
PaDeviceIndex output_device = find_config_device_by_name(true);
|
||||
PaDeviceIndex input_device = find_config_device_by_name(false);
|
||||
|
||||
qDebug() << "AudioManager: selected output device index=" << output_device
|
||||
<< "input device index=" << input_device;
|
||||
|
||||
SetOutputDevice(output_device);
|
||||
SetInputDevice(input_device);
|
||||
set_output_device(output_device);
|
||||
set_input_device(input_device);
|
||||
|
||||
output_buffer_ = new PreviewAudioDevice(this);
|
||||
output_buffer_->open(PreviewAudioDevice::ReadWrite);
|
||||
connect(output_buffer_, &PreviewAudioDevice::Notify, this,
|
||||
&AudioManager::OutputNotify);
|
||||
connect(output_buffer_, &PreviewAudioDevice::notify, this,
|
||||
&AudioManager::output_notify);
|
||||
}
|
||||
|
||||
AudioManager::~AudioManager()
|
||||
{
|
||||
CloseOutputStream();
|
||||
close_output_stream();
|
||||
|
||||
Pa_Terminate();
|
||||
}
|
||||
|
||||
+23
-23
@@ -19,8 +19,8 @@
|
||||
|
||||
***/
|
||||
|
||||
#ifndef AUDIOMANAGER_H
|
||||
#define AUDIOMANAGER_H
|
||||
#ifndef OAK_AUDIOMANAGER_H
|
||||
#define OAK_AUDIOMANAGER_H
|
||||
|
||||
#include <memory>
|
||||
#include <QtConcurrent/QtConcurrent>
|
||||
@@ -46,61 +46,61 @@ namespace olive
|
||||
class AudioManager : public QObject {
|
||||
Q_OBJECT
|
||||
public:
|
||||
static void CreateInstance();
|
||||
static void DestroyInstance();
|
||||
static void create_instance();
|
||||
static void destroy_instance();
|
||||
|
||||
static AudioManager *instance();
|
||||
|
||||
void SetOutputNotifyInterval(int n);
|
||||
void set_output_notify_interval(int n);
|
||||
|
||||
bool PushToOutput(const AudioParams ¶ms, const QByteArray &samples,
|
||||
bool push_to_output(const AudioParams ¶ms, const QByteArray &samples,
|
||||
QString *error = nullptr);
|
||||
|
||||
void ClearBufferedOutput();
|
||||
void clear_buffered_output();
|
||||
|
||||
void StopOutput();
|
||||
void stop_output();
|
||||
|
||||
PaDeviceIndex GetOutputDevice() const
|
||||
PaDeviceIndex get_output_device() const
|
||||
{
|
||||
return output_device_;
|
||||
}
|
||||
|
||||
PaDeviceIndex GetInputDevice() const
|
||||
PaDeviceIndex get_input_device() const
|
||||
{
|
||||
return input_device_;
|
||||
}
|
||||
|
||||
void SetOutputDevice(PaDeviceIndex device);
|
||||
void set_output_device(PaDeviceIndex device);
|
||||
|
||||
void SetInputDevice(PaDeviceIndex device);
|
||||
void set_input_device(PaDeviceIndex device);
|
||||
|
||||
void HardReset();
|
||||
void hard_reset();
|
||||
|
||||
bool StartRecording(const EncodingParams ¶ms,
|
||||
bool start_recording(const EncodingParams ¶ms,
|
||||
QString *error_str = nullptr);
|
||||
|
||||
void StopRecording();
|
||||
void stop_recording();
|
||||
|
||||
static PaDeviceIndex FindConfigDeviceByName(bool is_output_device);
|
||||
static PaDeviceIndex FindDeviceByName(const QString &s,
|
||||
static PaDeviceIndex find_config_device_by_name(bool is_output_device);
|
||||
static PaDeviceIndex find_device_by_name(const QString &s,
|
||||
bool is_output_device);
|
||||
|
||||
static PaStreamParameters GetPortAudioParams(const AudioParams &p,
|
||||
static PaStreamParameters get_port_audio_params(const AudioParams &p,
|
||||
PaDeviceIndex device);
|
||||
|
||||
signals:
|
||||
void OutputNotify();
|
||||
void output_notify();
|
||||
|
||||
void OutputParamsChanged();
|
||||
void output_params_changed();
|
||||
|
||||
private:
|
||||
AudioManager();
|
||||
|
||||
virtual ~AudioManager() override;
|
||||
|
||||
static PaSampleFormat GetPortAudioSampleFormat(SampleFormat fmt);
|
||||
static PaSampleFormat get_port_audio_sample_format(SampleFormat fmt);
|
||||
|
||||
void CloseOutputStream();
|
||||
void close_output_stream();
|
||||
|
||||
static AudioManager *instance_;
|
||||
|
||||
@@ -117,4 +117,4 @@ private:
|
||||
|
||||
}
|
||||
|
||||
#endif // AUDIOMANAGER_H
|
||||
#endif // OAK_AUDIOMANAGER_H
|
||||
|
||||
@@ -38,7 +38,7 @@ namespace olive
|
||||
* If the mask is zero, fall back to a default layout derived from the
|
||||
* channel count (stereo when unknown).
|
||||
*/
|
||||
static AudioParams FixChannelLayout(const AudioParams ¶ms)
|
||||
static AudioParams fix_channel_layout(const AudioParams ¶ms)
|
||||
{
|
||||
AudioParams result = params;
|
||||
|
||||
@@ -66,10 +66,10 @@ AudioProcessor::AudioProcessor()
|
||||
|
||||
AudioProcessor::~AudioProcessor()
|
||||
{
|
||||
Close();
|
||||
close();
|
||||
}
|
||||
|
||||
bool AudioProcessor::Open(const AudioParams &from, const AudioParams &to,
|
||||
bool AudioProcessor::open(const AudioParams &from, const AudioParams &to,
|
||||
double tempo)
|
||||
{
|
||||
if (graph_) {
|
||||
@@ -77,8 +77,8 @@ bool AudioProcessor::Open(const AudioParams &from, const AudioParams &to,
|
||||
return false;
|
||||
}
|
||||
|
||||
AudioParams from_fixed = FixChannelLayout(from);
|
||||
AudioParams to_fixed = FixChannelLayout(to);
|
||||
AudioParams from_fixed = fix_channel_layout(from);
|
||||
AudioParams to_fixed = fix_channel_layout(to);
|
||||
|
||||
qDebug() << "AudioProcessor::Open: from sample_rate="
|
||||
<< from_fixed.sample_rate() << "channels="
|
||||
@@ -92,13 +92,13 @@ bool AudioProcessor::Open(const AudioParams &from, const AudioParams &to,
|
||||
config.in_sample_rate = from_fixed.sample_rate();
|
||||
config.in_channel_layout_mask = from_fixed.channel_layout();
|
||||
config.in_sample_format =
|
||||
FFmpegUtils::GetFFmpegSampleFormat(from_fixed.format());
|
||||
FFmpegUtils::get_f_fmpeg_sample_format(from_fixed.format());
|
||||
config.in_channels = from_fixed.channel_count();
|
||||
|
||||
config.out_sample_rate = to_fixed.sample_rate();
|
||||
config.out_channel_layout_mask = to_fixed.channel_layout();
|
||||
config.out_sample_format =
|
||||
FFmpegUtils::GetFFmpegSampleFormat(to_fixed.format());
|
||||
FFmpegUtils::get_f_fmpeg_sample_format(to_fixed.format());
|
||||
config.out_channels = to_fixed.channel_count();
|
||||
config.out_is_planar = to_fixed.format().is_planar() ? 1 : 0;
|
||||
|
||||
@@ -113,7 +113,7 @@ bool AudioProcessor::Open(const AudioParams &from, const AudioParams &to,
|
||||
out_frame_ = fb_frame_alloc();
|
||||
if (!out_frame_) {
|
||||
qCritical() << "Failed to allocate output frame";
|
||||
Close();
|
||||
close();
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -123,7 +123,7 @@ bool AudioProcessor::Open(const AudioParams &from, const AudioParams &to,
|
||||
return true;
|
||||
}
|
||||
|
||||
void AudioProcessor::Close()
|
||||
void AudioProcessor::close()
|
||||
{
|
||||
if (graph_) {
|
||||
fb_audio_graph_free(&graph_);
|
||||
@@ -134,10 +134,10 @@ void AudioProcessor::Close()
|
||||
}
|
||||
}
|
||||
|
||||
int AudioProcessor::Convert(float **in, int nb_in_samples,
|
||||
int AudioProcessor::convert(float **in, int nb_in_samples,
|
||||
AudioProcessor::Buffer *output)
|
||||
{
|
||||
if (!IsOpen()) {
|
||||
if (!is_open()) {
|
||||
qCritical() << "Tried to convert on closed processor";
|
||||
return -1;
|
||||
}
|
||||
@@ -197,7 +197,7 @@ int AudioProcessor::Convert(float **in, int nb_in_samples,
|
||||
return r;
|
||||
}
|
||||
|
||||
void AudioProcessor::Flush()
|
||||
void AudioProcessor::flush()
|
||||
{
|
||||
int r = fb_audio_graph_push(graph_, nullptr, 0);
|
||||
if (r < 0) {
|
||||
|
||||
@@ -19,8 +19,8 @@
|
||||
|
||||
***/
|
||||
|
||||
#ifndef AUDIOPROCESSOR_H
|
||||
#define AUDIOPROCESSOR_H
|
||||
#ifndef OAK_AUDIOPROCESSOR_H
|
||||
#define OAK_AUDIOPROCESSOR_H
|
||||
|
||||
#include <inttypes.h>
|
||||
#include <olive/core/core.h>
|
||||
@@ -43,20 +43,20 @@ public:
|
||||
|
||||
DISABLE_COPY_MOVE(AudioProcessor)
|
||||
|
||||
bool Open(const AudioParams &from, const AudioParams &to,
|
||||
bool open(const AudioParams &from, const AudioParams &to,
|
||||
double tempo = 1.0);
|
||||
|
||||
void Close();
|
||||
void close();
|
||||
|
||||
bool IsOpen() const
|
||||
bool is_open() const
|
||||
{
|
||||
return graph_;
|
||||
}
|
||||
|
||||
using Buffer = QVector<QByteArray>;
|
||||
int Convert(float **in, int nb_in_samples, AudioProcessor::Buffer *output);
|
||||
int convert(float **in, int nb_in_samples, AudioProcessor::Buffer *output);
|
||||
|
||||
void Flush();
|
||||
void flush();
|
||||
|
||||
const AudioParams &from() const
|
||||
{
|
||||
@@ -79,4 +79,4 @@ private:
|
||||
|
||||
}
|
||||
|
||||
#endif // AUDIOPROCESSOR_H
|
||||
#endif // OAK_AUDIOPROCESSOR_H
|
||||
|
||||
@@ -23,9 +23,9 @@
|
||||
namespace olive
|
||||
{
|
||||
|
||||
AudioSynchronizer::Placement AudioSynchronizer::PlaceBySourceTime(
|
||||
AudioSynchronizer::Placement AudioSynchronizer::place_by_source_time(
|
||||
const SourceClip &reference, const SourceClip &candidate,
|
||||
const core::rational &reference_timeline_in)
|
||||
const core::Rational &reference_timeline_in)
|
||||
{
|
||||
Placement placement;
|
||||
if (!reference.has_source_start_time || !candidate.has_source_start_time ||
|
||||
@@ -34,9 +34,9 @@ AudioSynchronizer::Placement AudioSynchronizer::PlaceBySourceTime(
|
||||
return placement;
|
||||
}
|
||||
|
||||
const core::rational reference_head_source =
|
||||
const core::Rational reference_head_source =
|
||||
reference.source_start_time + reference.media_in;
|
||||
const core::rational candidate_head_source =
|
||||
const core::Rational candidate_head_source =
|
||||
candidate.source_start_time + candidate.media_in;
|
||||
|
||||
placement.timeline_in =
|
||||
@@ -45,8 +45,8 @@ AudioSynchronizer::Placement AudioSynchronizer::PlaceBySourceTime(
|
||||
return placement;
|
||||
}
|
||||
|
||||
AudioSynchronizer::Placement AudioSynchronizer::PlaceByWaveformOffset(
|
||||
const core::rational &reference_timeline_in,
|
||||
AudioSynchronizer::Placement AudioSynchronizer::place_by_waveform_offset(
|
||||
const core::Rational &reference_timeline_in,
|
||||
int64_t candidate_offset_samples, int sample_rate)
|
||||
{
|
||||
Placement placement;
|
||||
@@ -55,7 +55,7 @@ AudioSynchronizer::Placement AudioSynchronizer::PlaceByWaveformOffset(
|
||||
}
|
||||
|
||||
placement.timeline_in = reference_timeline_in +
|
||||
core::rational::fromDouble(
|
||||
core::Rational::from_double(
|
||||
static_cast<double>(candidate_offset_samples) /
|
||||
static_cast<double>(sample_rate));
|
||||
placement.valid = !placement.timeline_in.isNaN();
|
||||
|
||||
@@ -18,8 +18,8 @@
|
||||
|
||||
***/
|
||||
|
||||
#ifndef AUDIOSYNCHRONIZER_H
|
||||
#define AUDIOSYNCHRONIZER_H
|
||||
#ifndef OAK_AUDIOSYNCHRONIZER_H
|
||||
#define OAK_AUDIOSYNCHRONIZER_H
|
||||
|
||||
#include <cstdint>
|
||||
|
||||
@@ -31,25 +31,25 @@ namespace olive
|
||||
class AudioSynchronizer {
|
||||
public:
|
||||
struct SourceClip {
|
||||
core::rational source_start_time;
|
||||
core::rational media_in;
|
||||
core::Rational source_start_time;
|
||||
core::Rational media_in;
|
||||
bool has_source_start_time = false;
|
||||
};
|
||||
|
||||
struct Placement {
|
||||
core::rational timeline_in;
|
||||
core::Rational timeline_in;
|
||||
bool valid = false;
|
||||
};
|
||||
|
||||
static Placement
|
||||
PlaceBySourceTime(const SourceClip &reference, const SourceClip &candidate,
|
||||
const core::rational &reference_timeline_in);
|
||||
place_by_source_time(const SourceClip &reference, const SourceClip &candidate,
|
||||
const core::Rational &reference_timeline_in);
|
||||
|
||||
static Placement
|
||||
PlaceByWaveformOffset(const core::rational &reference_timeline_in,
|
||||
place_by_waveform_offset(const core::Rational &reference_timeline_in,
|
||||
int64_t candidate_offset_samples, int sample_rate);
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
#endif // AUDIOSYNCHRONIZER_H
|
||||
#endif // OAK_AUDIOSYNCHRONIZER_H
|
||||
|
||||
@@ -29,19 +29,19 @@
|
||||
namespace olive
|
||||
{
|
||||
|
||||
const rational AudioVisualWaveform::kMinimumSampleRate = rational(1, 8);
|
||||
const rational AudioVisualWaveform::kMaximumSampleRate = 1024;
|
||||
const Rational AudioVisualWaveform::k_minimum_sample_rate = Rational(1, 8);
|
||||
const Rational AudioVisualWaveform::k_maximum_sample_rate = 1024;
|
||||
|
||||
AudioVisualWaveform::AudioVisualWaveform()
|
||||
: channels_(0)
|
||||
{
|
||||
for (rational i = kMinimumSampleRate; i <= kMaximumSampleRate; i *= 2) {
|
||||
for (Rational i = k_minimum_sample_rate; i <= k_maximum_sample_rate; i *= 2) {
|
||||
mipmapped_data_.insert({ i, Sample() });
|
||||
}
|
||||
}
|
||||
|
||||
void AudioVisualWaveform::OverwriteSamplesFromBuffer(
|
||||
const SampleBuffer &samples, int sample_rate, const rational &start,
|
||||
void AudioVisualWaveform::overwrite_samples_from_buffer(
|
||||
const SampleBuffer &samples, int sample_rate, const Rational &start,
|
||||
double target_rate, Sample &data, size_t &start_index,
|
||||
size_t &samples_length)
|
||||
{
|
||||
@@ -64,16 +64,16 @@ void AudioVisualWaveform::OverwriteSamplesFromBuffer(
|
||||
size_t(qRound64((double(i + channels_) * chunk_size))) / channels_,
|
||||
samples.sample_count());
|
||||
|
||||
Sample summary = SumSamples(samples, src_start, src_end - src_start);
|
||||
Sample summary = sum_samples(samples, src_start, src_end - src_start);
|
||||
|
||||
memcpy(&data.data()[i + start_index], summary.data(),
|
||||
summary.size() * sizeof(SamplePerChannel));
|
||||
}
|
||||
}
|
||||
|
||||
void AudioVisualWaveform::OverwriteSamplesFromMipmap(
|
||||
void AudioVisualWaveform::overwrite_samples_from_mipmap(
|
||||
const AudioVisualWaveform::Sample &input, double input_sample_rate,
|
||||
size_t &input_start, size_t &input_length, const rational &start,
|
||||
size_t &input_start, size_t &input_length, const Rational &start,
|
||||
double output_rate, AudioVisualWaveform::Sample &output_data)
|
||||
{
|
||||
size_t start_index = time_to_samples(start, output_rate);
|
||||
@@ -91,7 +91,7 @@ void AudioVisualWaveform::OverwriteSamplesFromMipmap(
|
||||
|
||||
for (size_t i = 0; i < samples_length; i += channels_) {
|
||||
Sample summary =
|
||||
ReSumSamples(&input.data()[input_start + (i * chunk_size)],
|
||||
re_sum_samples(&input.data()[input_start + (i * chunk_size)],
|
||||
chunk_size * channels_, channels_);
|
||||
|
||||
memcpy(&output_data.data()[i + start_index], summary.data(),
|
||||
@@ -102,31 +102,31 @@ void AudioVisualWaveform::OverwriteSamplesFromMipmap(
|
||||
input_length = samples_length;
|
||||
}
|
||||
|
||||
void AudioVisualWaveform::ValidateVirtualStart(const rational &new_start)
|
||||
void AudioVisualWaveform::validate_virtual_start(const Rational &new_start)
|
||||
{
|
||||
if (length_ == 0) {
|
||||
virtual_start_ = new_start;
|
||||
} else if (virtual_start_ > new_start) {
|
||||
TrimIn(new_start - virtual_start_);
|
||||
trim_in(new_start - virtual_start_);
|
||||
}
|
||||
}
|
||||
|
||||
void AudioVisualWaveform::OverwriteSamples(const SampleBuffer &samples,
|
||||
void AudioVisualWaveform::overwrite_samples(const SampleBuffer &samples,
|
||||
int sample_rate,
|
||||
const rational &start)
|
||||
const Rational &start)
|
||||
{
|
||||
if (!channels_) {
|
||||
qWarning() << "Failed to write samples - channel count is zero";
|
||||
return;
|
||||
}
|
||||
|
||||
ValidateVirtualStart(start);
|
||||
validate_virtual_start(start);
|
||||
|
||||
// Process the largest mipmap directly for the samples
|
||||
auto current_mipmap = mipmapped_data_.rbegin();
|
||||
size_t input_start, input_length;
|
||||
OverwriteSamplesFromBuffer(samples, sample_rate, start - virtual_start_,
|
||||
current_mipmap->first.toDouble(),
|
||||
overwrite_samples_from_buffer(samples, sample_rate, start - virtual_start_,
|
||||
current_mipmap->first.to_double(),
|
||||
current_mipmap->second, input_start,
|
||||
input_length);
|
||||
|
||||
@@ -139,37 +139,37 @@ void AudioVisualWaveform::OverwriteSamples(const SampleBuffer &samples,
|
||||
break;
|
||||
}
|
||||
|
||||
OverwriteSamplesFromMipmap(
|
||||
previous_mipmap->second, previous_mipmap->first.toDouble(),
|
||||
overwrite_samples_from_mipmap(
|
||||
previous_mipmap->second, previous_mipmap->first.to_double(),
|
||||
input_start, input_length, start - virtual_start_,
|
||||
current_mipmap->first.toDouble(), current_mipmap->second);
|
||||
current_mipmap->first.to_double(), current_mipmap->second);
|
||||
}
|
||||
|
||||
rational sample_length(samples.sample_count(), sample_rate);
|
||||
Rational sample_length(samples.sample_count(), sample_rate);
|
||||
length_ = qMax(length_, start + sample_length);
|
||||
}
|
||||
|
||||
void AudioVisualWaveform::OverwriteSums(const AudioVisualWaveform &sums,
|
||||
const rational &dest,
|
||||
const rational &offset,
|
||||
const rational &length)
|
||||
void AudioVisualWaveform::overwrite_sums(const AudioVisualWaveform &sums,
|
||||
const Rational &dest,
|
||||
const Rational &offset,
|
||||
const Rational &length)
|
||||
{
|
||||
ValidateVirtualStart(dest);
|
||||
validate_virtual_start(dest);
|
||||
|
||||
for (auto it = mipmapped_data_.begin(); it != mipmapped_data_.end(); it++) {
|
||||
rational rate = it->first;
|
||||
Rational rate = it->first;
|
||||
|
||||
Sample &our_arr = it->second;
|
||||
const Sample &their_arr = sums.mipmapped_data_.at(rate);
|
||||
|
||||
double rate_dbl = rate.toDouble();
|
||||
double rate_dbl = rate.to_double();
|
||||
|
||||
// Get our destination sample
|
||||
size_t our_start_index =
|
||||
time_to_samples(dest - virtual_start_, rate_dbl);
|
||||
|
||||
// Get our source sample, indexing with the SOURCE's channel count
|
||||
size_t their_start_index = std::floor(offset.toDouble() * rate_dbl) *
|
||||
size_t their_start_index = std::floor(offset.to_double() * rate_dbl) *
|
||||
sums.channel_count();
|
||||
if (their_start_index >= their_arr.size()) {
|
||||
continue;
|
||||
@@ -201,17 +201,17 @@ void AudioVisualWaveform::OverwriteSums(const AudioVisualWaveform &sums,
|
||||
length));
|
||||
}
|
||||
|
||||
void AudioVisualWaveform::OverwriteSilence(const rational &start,
|
||||
const rational &length)
|
||||
void AudioVisualWaveform::overwrite_silence(const Rational &start,
|
||||
const Rational &length)
|
||||
{
|
||||
ValidateVirtualStart(start);
|
||||
validate_virtual_start(start);
|
||||
|
||||
for (auto it = mipmapped_data_.begin(); it != mipmapped_data_.end(); it++) {
|
||||
rational rate = it->first;
|
||||
Rational rate = it->first;
|
||||
|
||||
Sample &our_arr = it->second;
|
||||
|
||||
double rate_dbl = rate.toDouble();
|
||||
double rate_dbl = rate.to_double();
|
||||
|
||||
// Get our destination sample
|
||||
size_t our_start_index =
|
||||
@@ -231,7 +231,7 @@ void AudioVisualWaveform::OverwriteSilence(const rational &start,
|
||||
length_ = qMax(length_, start + length);
|
||||
}
|
||||
|
||||
void AudioVisualWaveform::TrimIn(rational length)
|
||||
void AudioVisualWaveform::trim_in(Rational length)
|
||||
{
|
||||
if (length == 0) {
|
||||
return;
|
||||
@@ -245,8 +245,8 @@ void AudioVisualWaveform::TrimIn(rational length)
|
||||
}
|
||||
|
||||
for (auto it = mipmapped_data_.begin(); it != mipmapped_data_.end(); it++) {
|
||||
rational rate = it->first;
|
||||
double rate_dbl = rate.toDouble();
|
||||
Rational rate = it->first;
|
||||
double rate_dbl = rate.to_double();
|
||||
Sample &data = it->second;
|
||||
|
||||
size_t chop_length = time_to_samples(length, rate_dbl);
|
||||
@@ -262,40 +262,40 @@ void AudioVisualWaveform::TrimIn(rational length)
|
||||
}
|
||||
|
||||
if (!negative) {
|
||||
length_ = qMax(rational(0), length_ - length);
|
||||
length_ = qMax(Rational(0), length_ - length);
|
||||
}
|
||||
// Prepending grows the data before the existing start, so the absolute
|
||||
// end (which length_ tracks) is unchanged
|
||||
}
|
||||
|
||||
AudioVisualWaveform AudioVisualWaveform::Mid(const rational &offset) const
|
||||
AudioVisualWaveform AudioVisualWaveform::mid(const Rational &offset) const
|
||||
{
|
||||
AudioVisualWaveform mid = *this;
|
||||
|
||||
mid.TrimIn(offset - virtual_start_);
|
||||
mid.trim_in(offset - virtual_start_);
|
||||
|
||||
return mid;
|
||||
}
|
||||
|
||||
AudioVisualWaveform AudioVisualWaveform::Mid(const rational &offset,
|
||||
const rational &length) const
|
||||
AudioVisualWaveform AudioVisualWaveform::mid(const Rational &offset,
|
||||
const Rational &length) const
|
||||
{
|
||||
AudioVisualWaveform mid = *this;
|
||||
|
||||
mid.TrimRange(offset - virtual_start_, length);
|
||||
mid.trim_range(offset - virtual_start_, length);
|
||||
|
||||
return mid;
|
||||
}
|
||||
|
||||
void AudioVisualWaveform::Resize(const rational &length)
|
||||
void AudioVisualWaveform::resize(const Rational &length)
|
||||
{
|
||||
if (length_ == length) {
|
||||
return;
|
||||
}
|
||||
|
||||
for (auto it = mipmapped_data_.begin(); it != mipmapped_data_.end(); it++) {
|
||||
rational rate = it->first;
|
||||
double rate_dbl = rate.toDouble();
|
||||
Rational rate = it->first;
|
||||
double rate_dbl = rate.to_double();
|
||||
Sample &data = it->second;
|
||||
|
||||
size_t chop_length = time_to_samples(length, rate_dbl);
|
||||
@@ -306,20 +306,20 @@ void AudioVisualWaveform::Resize(const rational &length)
|
||||
length_ = length;
|
||||
}
|
||||
|
||||
void AudioVisualWaveform::TrimRange(const rational &in, const rational &length)
|
||||
void AudioVisualWaveform::trim_range(const Rational &in, const Rational &length)
|
||||
{
|
||||
TrimIn(in);
|
||||
Resize(length);
|
||||
trim_in(in);
|
||||
resize(length);
|
||||
}
|
||||
|
||||
AudioVisualWaveform::Sample
|
||||
AudioVisualWaveform::GetSummaryFromTime(const rational &start,
|
||||
const rational &length) const
|
||||
AudioVisualWaveform::get_summary_from_time(const Rational &start,
|
||||
const Rational &length) const
|
||||
{
|
||||
// Find mipmap that requires
|
||||
auto using_mipmap = GetMipmapForScale(length.flipped().toDouble());
|
||||
auto using_mipmap = get_mipmap_for_scale(length.flipped().to_double());
|
||||
|
||||
double rate_dbl = using_mipmap->first.toDouble();
|
||||
double rate_dbl = using_mipmap->first.to_double();
|
||||
|
||||
size_t start_sample = time_to_samples(start - virtual_start_, rate_dbl);
|
||||
size_t sample_length = time_to_samples(length, rate_dbl);
|
||||
@@ -333,7 +333,7 @@ AudioVisualWaveform::GetSummaryFromTime(const rational &start,
|
||||
sample_length = qMin(sample_length, size_t(available));
|
||||
|
||||
if (sample_length > 0) {
|
||||
return ReSumSamples(&mipmap_data.data()[start_sample],
|
||||
return re_sum_samples(&mipmap_data.data()[start_sample],
|
||||
sample_length, channels_);
|
||||
}
|
||||
}
|
||||
@@ -342,7 +342,7 @@ AudioVisualWaveform::GetSummaryFromTime(const rational &start,
|
||||
return AudioVisualWaveform::Sample(channel_count(), { 0, 0 });
|
||||
}
|
||||
|
||||
void ExpandMinMaxChannel(const float *a, size_t length, float &min_val,
|
||||
void expand_min_max_channel(const float *a, size_t length, float &min_val,
|
||||
float &max_val)
|
||||
{
|
||||
#if defined(Q_PROCESSOR_X86) || defined(Q_PROCESSOR_ARM)
|
||||
@@ -387,7 +387,7 @@ void ExpandMinMaxChannel(const float *a, size_t length, float &min_val,
|
||||
}
|
||||
|
||||
AudioVisualWaveform::Sample
|
||||
AudioVisualWaveform::SumSamples(const SampleBuffer &samples, size_t start_index,
|
||||
AudioVisualWaveform::sum_samples(const SampleBuffer &samples, size_t start_index,
|
||||
size_t length)
|
||||
{
|
||||
int channels = samples.audio_params().channel_count();
|
||||
@@ -395,7 +395,7 @@ AudioVisualWaveform::SumSamples(const SampleBuffer &samples, size_t start_index,
|
||||
|
||||
for (int channel = 0; channel < samples.audio_params().channel_count();
|
||||
channel++) {
|
||||
ExpandMinMaxChannel(samples.data(channel) + start_index, length,
|
||||
expand_min_max_channel(samples.data(channel) + start_index, length,
|
||||
summed_samples[channel].min,
|
||||
summed_samples[channel].max);
|
||||
}
|
||||
@@ -409,7 +409,7 @@ AudioVisualWaveform::SumSamples(const SampleBuffer &samples, size_t start_index,
|
||||
}
|
||||
|
||||
AudioVisualWaveform::Sample
|
||||
AudioVisualWaveform::ReSumSamples(const SamplePerChannel *samples,
|
||||
AudioVisualWaveform::re_sum_samples(const SamplePerChannel *samples,
|
||||
size_t nb_samples, int nb_channels)
|
||||
{
|
||||
AudioVisualWaveform::Sample summed_samples(nb_channels);
|
||||
@@ -437,7 +437,7 @@ template <typename T> inline int round_away_from_zero(T t)
|
||||
return (t < 0) ? std::floor(t) : std::ceil(t);
|
||||
}
|
||||
|
||||
void AudioVisualWaveform::DrawSample(QPainter *painter, const Sample &sample,
|
||||
void AudioVisualWaveform::draw_sample(QPainter *painter, const Sample &sample,
|
||||
int x, int y, int height, bool rectified)
|
||||
{
|
||||
if (sample.empty()) {
|
||||
@@ -475,19 +475,19 @@ void AudioVisualWaveform::DrawSample(QPainter *painter, const Sample &sample,
|
||||
}
|
||||
}
|
||||
|
||||
void AudioVisualWaveform::DrawWaveform(QPainter *painter, const QRect &rect,
|
||||
void AudioVisualWaveform::draw_waveform(QPainter *painter, const QRect &rect,
|
||||
const double &scale,
|
||||
const AudioVisualWaveform &samples,
|
||||
const rational &start_time)
|
||||
const Rational &start_time)
|
||||
{
|
||||
if (samples.mipmapped_data_.empty()) {
|
||||
return;
|
||||
}
|
||||
|
||||
auto using_mipmap = samples.GetMipmapForScale(scale);
|
||||
auto using_mipmap = samples.get_mipmap_for_scale(scale);
|
||||
|
||||
rational rate = using_mipmap->first;
|
||||
double rate_dbl = rate.toDouble();
|
||||
Rational rate = using_mipmap->first;
|
||||
double rate_dbl = rate.to_double();
|
||||
const Sample &arr = using_mipmap->second;
|
||||
|
||||
size_t start_sample_index =
|
||||
@@ -509,7 +509,7 @@ void AudioVisualWaveform::DrawWaveform(QPainter *painter, const QRect &rect,
|
||||
size_t start = qMax(rect.x(), -top_left.x());
|
||||
size_t end = qMin(rect.right(), -top_left.x() + viewport.width());
|
||||
|
||||
bool rectified = OLIVE_CONFIG("RectifiedWaveforms").toBool();
|
||||
bool rectified = OAK_CONFIG("RectifiedWaveforms").toBool();
|
||||
|
||||
for (size_t i = start; i < end; i++) {
|
||||
sample_index = next_sample_index;
|
||||
@@ -526,7 +526,7 @@ void AudioVisualWaveform::DrawWaveform(QPainter *painter, const QRect &rect,
|
||||
samples.channel_count()));
|
||||
|
||||
if (summary_index != sample_index) {
|
||||
summary = AudioVisualWaveform::ReSumSamples(
|
||||
summary = AudioVisualWaveform::re_sum_samples(
|
||||
&arr.at(sample_index),
|
||||
qMax(size_t(samples.channel_count()),
|
||||
next_sample_index - sample_index),
|
||||
@@ -534,14 +534,14 @@ void AudioVisualWaveform::DrawWaveform(QPainter *painter, const QRect &rect,
|
||||
summary_index = sample_index;
|
||||
}
|
||||
|
||||
DrawSample(painter, summary, i, rect.y(), rect.height(), rectified);
|
||||
draw_sample(painter, summary, i, rect.y(), rect.height(), rectified);
|
||||
}
|
||||
}
|
||||
|
||||
size_t AudioVisualWaveform::time_to_samples(const rational &time,
|
||||
size_t AudioVisualWaveform::time_to_samples(const Rational &time,
|
||||
double sample_rate) const
|
||||
{
|
||||
return time_to_samples(time.toDouble(), sample_rate);
|
||||
return time_to_samples(time.to_double(), sample_rate);
|
||||
}
|
||||
|
||||
size_t AudioVisualWaveform::time_to_samples(const double &time,
|
||||
@@ -550,13 +550,13 @@ size_t AudioVisualWaveform::time_to_samples(const double &time,
|
||||
return std::floor(time * sample_rate) * channels_;
|
||||
}
|
||||
|
||||
std::map<rational, AudioVisualWaveform::Sample>::const_iterator
|
||||
AudioVisualWaveform::GetMipmapForScale(double scale) const
|
||||
std::map<Rational, AudioVisualWaveform::Sample>::const_iterator
|
||||
AudioVisualWaveform::get_mipmap_for_scale(double scale) const
|
||||
{
|
||||
// Find largest mipmap for this scale (or the largest if we don't find one sufficient)
|
||||
for (auto it = mipmapped_data_.cbegin(); it != mipmapped_data_.cend();
|
||||
it++) {
|
||||
if (it->first.toDouble() >= scale) {
|
||||
if (it->first.to_double() >= scale) {
|
||||
return it;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -19,8 +19,8 @@
|
||||
|
||||
***/
|
||||
|
||||
#ifndef SUMSAMPLES_H
|
||||
#define SUMSAMPLES_H
|
||||
#ifndef OAK_SUMSAMPLES_H
|
||||
#define OAK_SUMSAMPLES_H
|
||||
|
||||
#include <olive/core/core.h>
|
||||
#include <QPainter>
|
||||
@@ -58,7 +58,7 @@ public:
|
||||
channels_ = channels;
|
||||
}
|
||||
|
||||
const rational &length() const
|
||||
const Rational &length() const
|
||||
{
|
||||
return length_;
|
||||
}
|
||||
@@ -68,8 +68,8 @@ public:
|
||||
*
|
||||
* Starting at `start`, writes samples over anything in the buffer, expanding it if necessary.
|
||||
*/
|
||||
void OverwriteSamples(const SampleBuffer &samples, int sample_rate,
|
||||
const rational &start = 0);
|
||||
void overwrite_samples(const SampleBuffer &samples, int sample_rate,
|
||||
const Rational &start = 0);
|
||||
|
||||
/**
|
||||
* @brief Replaces sums at a certain range in this visual waveform
|
||||
@@ -90,74 +90,74 @@ public:
|
||||
*
|
||||
* Maximum length of `sums` to overwrite with.
|
||||
*/
|
||||
void OverwriteSums(const AudioVisualWaveform &sums, const rational &dest,
|
||||
const rational &offset = 0, const rational &length = 0);
|
||||
void overwrite_sums(const AudioVisualWaveform &sums, const Rational &dest,
|
||||
const Rational &offset = 0, const Rational &length = 0);
|
||||
|
||||
void OverwriteSilence(const rational &start, const rational &length);
|
||||
void overwrite_silence(const Rational &start, const Rational &length);
|
||||
|
||||
void TrimIn(rational length);
|
||||
void trim_in(Rational length);
|
||||
|
||||
AudioVisualWaveform Mid(const rational &offset) const;
|
||||
AudioVisualWaveform Mid(const rational &offset,
|
||||
const rational &length) const;
|
||||
AudioVisualWaveform mid(const Rational &offset) const;
|
||||
AudioVisualWaveform mid(const Rational &offset,
|
||||
const Rational &length) const;
|
||||
|
||||
void Resize(const rational &length);
|
||||
void resize(const Rational &length);
|
||||
|
||||
void TrimRange(const rational &in, const rational &length);
|
||||
void trim_range(const Rational &in, const Rational &length);
|
||||
|
||||
Sample GetSummaryFromTime(const rational &start,
|
||||
const rational &length) const;
|
||||
Sample get_summary_from_time(const Rational &start,
|
||||
const Rational &length) const;
|
||||
|
||||
static Sample SumSamples(const SampleBuffer &samples, size_t start_index,
|
||||
static Sample sum_samples(const SampleBuffer &samples, size_t start_index,
|
||||
size_t length);
|
||||
|
||||
static Sample ReSumSamples(const SamplePerChannel *samples,
|
||||
static Sample re_sum_samples(const SamplePerChannel *samples,
|
||||
size_t nb_samples, int nb_channels);
|
||||
|
||||
static void DrawSample(QPainter *painter, const Sample &sample, int x,
|
||||
static void draw_sample(QPainter *painter, const Sample &sample, int x,
|
||||
int y, int height, bool rectified);
|
||||
|
||||
static void DrawWaveform(QPainter *painter, const QRect &rect,
|
||||
static void draw_waveform(QPainter *painter, const QRect &rect,
|
||||
const double &scale,
|
||||
const AudioVisualWaveform &samples,
|
||||
const rational &start_time);
|
||||
const Rational &start_time);
|
||||
|
||||
// Must be a power of 2
|
||||
static const rational kMinimumSampleRate;
|
||||
static const rational kMaximumSampleRate;
|
||||
static const Rational k_minimum_sample_rate;
|
||||
static const Rational k_maximum_sample_rate;
|
||||
|
||||
private:
|
||||
void OverwriteSamplesFromBuffer(const SampleBuffer &samples,
|
||||
int sample_rate, const rational &start,
|
||||
void overwrite_samples_from_buffer(const SampleBuffer &samples,
|
||||
int sample_rate, const Rational &start,
|
||||
double target_rate, Sample &data,
|
||||
size_t &start_index,
|
||||
size_t &samples_length);
|
||||
|
||||
void OverwriteSamplesFromMipmap(const Sample &input,
|
||||
void overwrite_samples_from_mipmap(const Sample &input,
|
||||
double input_sample_rate,
|
||||
size_t &input_start, size_t &input_length,
|
||||
const rational &start, double output_rate,
|
||||
const Rational &start, double output_rate,
|
||||
Sample &output_data);
|
||||
|
||||
size_t time_to_samples(const rational &time, double sample_rate) const;
|
||||
size_t time_to_samples(const Rational &time, double sample_rate) const;
|
||||
size_t time_to_samples(const double &time, double sample_rate) const;
|
||||
|
||||
std::map<rational, Sample>::const_iterator
|
||||
GetMipmapForScale(double scale) const;
|
||||
std::map<Rational, Sample>::const_iterator
|
||||
get_mipmap_for_scale(double scale) const;
|
||||
|
||||
void ValidateVirtualStart(const rational &new_start);
|
||||
void validate_virtual_start(const Rational &new_start);
|
||||
|
||||
rational virtual_start_;
|
||||
Rational virtual_start_;
|
||||
|
||||
int channels_;
|
||||
|
||||
std::map<rational, Sample> mipmapped_data_;
|
||||
std::map<Rational, Sample> mipmapped_data_;
|
||||
|
||||
rational length_;
|
||||
Rational length_;
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
Q_DECLARE_METATYPE(olive::AudioVisualWaveform)
|
||||
|
||||
#endif // SUMSAMPLES_H
|
||||
#endif // OAK_SUMSAMPLES_H
|
||||
|
||||
@@ -27,7 +27,7 @@ namespace olive
|
||||
{
|
||||
|
||||
QVector<double>
|
||||
AudioWaveformSync::ExtractRmsEnvelope(const core::SampleBuffer &samples,
|
||||
AudioWaveformSync::extract_rms_envelope(const core::SampleBuffer &samples,
|
||||
size_t window_samples)
|
||||
{
|
||||
QVector<double> envelope;
|
||||
@@ -64,7 +64,7 @@ AudioWaveformSync::ExtractRmsEnvelope(const core::SampleBuffer &samples,
|
||||
return envelope;
|
||||
}
|
||||
|
||||
AudioWaveformSync::OffsetResult AudioWaveformSync::EstimateOffset(
|
||||
AudioWaveformSync::OffsetResult AudioWaveformSync::estimate_offset(
|
||||
const core::SampleBuffer &reference, const core::SampleBuffer &candidate,
|
||||
size_t window_samples, int64_t max_offset_samples)
|
||||
{
|
||||
@@ -73,26 +73,26 @@ AudioWaveformSync::OffsetResult AudioWaveformSync::EstimateOffset(
|
||||
}
|
||||
|
||||
const QVector<double> reference_envelope =
|
||||
ExtractRmsEnvelope(reference, window_samples);
|
||||
extract_rms_envelope(reference, window_samples);
|
||||
const QVector<double> candidate_envelope =
|
||||
ExtractRmsEnvelope(candidate, window_samples);
|
||||
extract_rms_envelope(candidate, window_samples);
|
||||
const int64_t max_offset_windows =
|
||||
max_offset_samples / static_cast<int64_t>(window_samples);
|
||||
|
||||
return EstimateEnvelopeOffset(reference_envelope, candidate_envelope,
|
||||
return estimate_envelope_offset(reference_envelope, candidate_envelope,
|
||||
window_samples, max_offset_windows);
|
||||
}
|
||||
|
||||
AudioWaveformSync::OffsetResult AudioWaveformSync::EstimateEnvelopeOffset(
|
||||
AudioWaveformSync::OffsetResult AudioWaveformSync::estimate_envelope_offset(
|
||||
const QVector<double> &reference, const QVector<double> &candidate,
|
||||
size_t window_samples, int64_t max_offset_windows)
|
||||
{
|
||||
return EstimateEnvelopeOffset(reference, candidate, QVector<bool>(),
|
||||
return estimate_envelope_offset(reference, candidate, QVector<bool>(),
|
||||
QVector<bool>(), window_samples,
|
||||
max_offset_windows);
|
||||
}
|
||||
|
||||
AudioWaveformSync::OffsetResult AudioWaveformSync::EstimateEnvelopeOffset(
|
||||
AudioWaveformSync::OffsetResult AudioWaveformSync::estimate_envelope_offset(
|
||||
const QVector<double> &reference, const QVector<double> &candidate,
|
||||
const QVector<bool> &reference_valid, const QVector<bool> &candidate_valid,
|
||||
size_t window_samples, int64_t max_offset_windows)
|
||||
@@ -185,7 +185,7 @@ AudioWaveformSync::OffsetResult AudioWaveformSync::EstimateEnvelopeOffset(
|
||||
return result;
|
||||
}
|
||||
|
||||
AudioWaveformSync::StretchOffsetResult AudioWaveformSync::EstimateStretchAndOffset(
|
||||
AudioWaveformSync::StretchOffsetResult AudioWaveformSync::estimate_stretch_and_offset(
|
||||
const QVector<double> &reference, const QVector<double> &candidate,
|
||||
const QVector<bool> &reference_valid, const QVector<bool> &candidate_valid,
|
||||
size_t window_samples, int64_t max_offset_windows, double min_rate,
|
||||
@@ -226,7 +226,7 @@ AudioWaveformSync::StretchOffsetResult AudioWaveformSync::EstimateStretchAndOffs
|
||||
(candidate_valid.at(lower) && candidate_valid.at(upper)));
|
||||
}
|
||||
|
||||
const OffsetResult offset = EstimateEnvelopeOffset(
|
||||
const OffsetResult offset = estimate_envelope_offset(
|
||||
reference, resampled, reference_valid, resampled_valid,
|
||||
window_samples, max_offset_windows);
|
||||
|
||||
|
||||
@@ -18,8 +18,8 @@
|
||||
|
||||
***/
|
||||
|
||||
#ifndef AUDIOWAVEFORMSYNC_H
|
||||
#define AUDIOWAVEFORMSYNC_H
|
||||
#ifndef OAK_AUDIOWAVEFORMSYNC_H
|
||||
#define OAK_AUDIOWAVEFORMSYNC_H
|
||||
|
||||
#include <cstdint>
|
||||
|
||||
@@ -48,15 +48,15 @@ public:
|
||||
bool valid = false;
|
||||
};
|
||||
|
||||
static QVector<double> ExtractRmsEnvelope(const core::SampleBuffer &samples,
|
||||
static QVector<double> extract_rms_envelope(const core::SampleBuffer &samples,
|
||||
size_t window_samples);
|
||||
|
||||
static OffsetResult EstimateOffset(const core::SampleBuffer &reference,
|
||||
static OffsetResult estimate_offset(const core::SampleBuffer &reference,
|
||||
const core::SampleBuffer &candidate,
|
||||
size_t window_samples,
|
||||
int64_t max_offset_samples);
|
||||
|
||||
static OffsetResult EstimateEnvelopeOffset(const QVector<double> &reference,
|
||||
static OffsetResult estimate_envelope_offset(const QVector<double> &reference,
|
||||
const QVector<double> &candidate,
|
||||
size_t window_samples,
|
||||
int64_t max_offset_windows);
|
||||
@@ -71,7 +71,7 @@ public:
|
||||
* waveform cache have not been generated yet. Empty masks are treated as
|
||||
* "all windows valid".
|
||||
*/
|
||||
static OffsetResult EstimateEnvelopeOffset(const QVector<double> &reference,
|
||||
static OffsetResult estimate_envelope_offset(const QVector<double> &reference,
|
||||
const QVector<double> &candidate,
|
||||
const QVector<bool> &reference_valid,
|
||||
const QVector<bool> &candidate_valid,
|
||||
@@ -89,7 +89,7 @@ public:
|
||||
* callers should bound max_offset_windows to a sensible range.
|
||||
*/
|
||||
static StretchOffsetResult
|
||||
EstimateStretchAndOffset(const QVector<double> &reference,
|
||||
estimate_stretch_and_offset(const QVector<double> &reference,
|
||||
const QVector<double> &candidate,
|
||||
const QVector<bool> &reference_valid,
|
||||
const QVector<bool> &candidate_valid, size_t window_samples,
|
||||
@@ -99,4 +99,4 @@ public:
|
||||
|
||||
}
|
||||
|
||||
#endif // AUDIOWAVEFORMSYNC_H
|
||||
#endif // OAK_AUDIOWAVEFORMSYNC_H
|
||||
|
||||
Reference in New Issue
Block a user