diff options
author | Chris Robinson <[email protected]> | 2019-09-08 01:36:19 -0700 |
---|---|---|
committer | Chris Robinson <[email protected]> | 2019-09-08 01:38:20 -0700 |
commit | 19e1cd7430a19cb3592b4bd3e737e2a0e4314a91 (patch) | |
tree | c0e8707dc211dd471671469da338efe12d4410e1 | |
parent | 449c09bf031731a3f36b71f78a2d54b059802367 (diff) |
Make hq-mode the default and update ambisonics.txt
-rw-r--r-- | alc/panning.cpp | 7 | ||||
-rw-r--r-- | alsoftrc.sample | 2 | ||||
-rw-r--r-- | docs/ambisonics.txt | 41 | ||||
-rw-r--r-- | utils/alsoft-config/mainwindow.cpp | 4 |
4 files changed, 23 insertions, 31 deletions
diff --git a/alc/panning.cpp b/alc/panning.cpp index 5143b1ea..a33b9387 100644 --- a/alc/panning.cpp +++ b/alc/panning.cpp @@ -509,9 +509,8 @@ void InitCustomPanning(ALCdevice *device, bool hqdec, const AmbDecConf *conf, co auto accum_spkr_dist = std::bind(std::plus<float>{}, _1, std::bind(std::mem_fn(&AmbDecConf::SpeakerConf::Distance), _2)); const ALfloat avg_dist{ - std::accumulate(conf->Speakers.begin(), conf->Speakers.end(), float{0.0f}, - accum_spkr_dist) / static_cast<ALfloat>(conf->Speakers.size()) - }; + std::accumulate(conf->Speakers.begin(), conf->Speakers.end(), 0.0f, accum_spkr_dist) / + static_cast<ALfloat>(conf->Speakers.size())}; InitNearFieldCtrl(device, avg_dist, order, (conf->ChanMask&AMBI_PERIPHONIC_MASK) ? chans_per_order3d : chans_per_order2d); @@ -717,7 +716,7 @@ void aluInitRenderer(ALCdevice *device, ALint hrtf_id, HrtfRequestMode hrtf_appr InitPanning(device); else { - int hqdec{GetConfigValueBool(devname, "decoder", "hq-mode", 0)}; + int hqdec{GetConfigValueBool(devname, "decoder", "hq-mode", 1)}; InitCustomPanning(device, !!hqdec, pconf, speakermap); } if(device->AmbiDecoder) diff --git a/alsoftrc.sample b/alsoftrc.sample index f0dde916..7cb780a3 100644 --- a/alsoftrc.sample +++ b/alsoftrc.sample @@ -272,7 +272,7 @@ # configuration files for the appropriate speaker configuration you intend to # use (see the quad, surround51, etc options below). Currently, up to third- # order decoding is supported. -#hq-mode = false +#hq-mode = true ## distance-comp: # Enables compensation for the speakers' relative distances to the listener. diff --git a/docs/ambisonics.txt b/docs/ambisonics.txt index 2d94427e..b03e3bed 100644 --- a/docs/ambisonics.txt +++ b/docs/ambisonics.txt @@ -79,30 +79,23 @@ Soft (or any other OpenAL implementation that wishes to) can render using Ambisonics and decode the ambisonic mix for a high level of accuracy over what simple pan-pot could provide. -This is effectively what the high-quality mode option does, when given an -appropriate decoder configuation for the playback channel layout. 3D rendering -and effect mixing is done to an ambisonic buffer, which is later decoded for -output utilizing the benefits available to ambisonic processing. - -The basic, non-high-quality, renderer uses similar principles, however it skips -the frequency-dependent processing (so low frequency sounds are treated the -same as high frequency sounds) and does some creative manipulation of the -involved math to skip the intermediate ambisonic buffer, rendering more -directly to the output while still taking advantage of all the available -speakers to reconstruct the sound wave. This method trades away some playback -quality for less memory and processor usage. - -In addition to providing good support for surround sound playback, Ambisonics -also has benefits with stereo output. 2-channel UHJ is a stereo-compatible -format that encodes some surround sound information using a wide-band 90-degree -phase shift filter. It works by taking a B-Format signal, and deriving a -frontal stereo mix with the rear sounds attenuated and filtered in with it. -Although the result is not as good as 3-channel (2D) B-Format, it has the -distinct advantage of only using 2 channels and being compatible with stereo -output. This means it will sound just fine when played as-is through a normal -stereo device, or it may optionally be fed to a properly configured surround -sound receiver which can extract the encoded information and restore some of -the original surround sound signal. +When given an appropriate decoder configuration for the channel layout, the +ambisonic mix can be decoded utilizing the benefits available to ambisonic +processing, including frequency-dependent processing and near-field effects. +Without a decoder configuration, the ambisonic mix can still be decoded for +good stereo or surround sound output, although without near-field effects as +there's no speaker distance information. + +In addition to surround sound output, Ambisonics also has benefits with stereo +output. 2-channel UHJ is a stereo-compatible format that encodes some surround +sound information using a wide-band 90-degree phase shift filter. This is +generated by taking the ambisonic mix and deriving a front-stereo mix with +with the rear sounds filtered in with it. Although the result is not as good as +3-channel (2D) B-Format, it has the distinct advantage of only using 2 channels +and being compatible with stereo output. This means it will sound just fine +when played as-is through a normal stereo device, or it may optionally be fed +to a properly configured surround sound receiver which can extract the encoded +information and restore some of the original surround sound signal. What Are Its Limitations? diff --git a/utils/alsoft-config/mainwindow.cpp b/utils/alsoft-config/mainwindow.cpp index aa0df438..7e5159cf 100644 --- a/utils/alsoft-config/mainwindow.cpp +++ b/utils/alsoft-config/mainwindow.cpp @@ -716,7 +716,7 @@ void MainWindow::loadConfig(const QString &fname) } } - bool hqmode{settings.value("decoder/hq-mode", false).toBool()}; + bool hqmode{settings.value("decoder/hq-mode", true).toBool()}; ui->decoderHQModeCheckBox->setChecked(hqmode); ui->decoderDistCompCheckBox->setCheckState(getCheckState(settings.value("decoder/distance-comp"))); ui->decoderNFEffectsCheckBox->setCheckState(getCheckState(settings.value("decoder/nfc"))); @@ -976,7 +976,7 @@ void MainWindow::saveConfig(const QString &fname) const settings.setValue("dither", getCheckValue(ui->outputDitherCheckBox)); settings.setValue("decoder/hq-mode", - ui->decoderHQModeCheckBox->isChecked() ? QString{"true"} : QString{/*"false"*/} + ui->decoderHQModeCheckBox->isChecked() ? QString{/*"true"*/} : QString{"false"} ); settings.setValue("decoder/distance-comp", getCheckValue(ui->decoderDistCompCheckBox)); settings.setValue("decoder/nfc", getCheckValue(ui->decoderNFEffectsCheckBox)); |