Skip to content

Commit 702a85a

Browse files
committed
Implement UI for toggling sample format
1 parent 8268229 commit 702a85a

File tree

8 files changed

+150
-2
lines changed

8 files changed

+150
-2
lines changed

src/importexport/audioexport/iaudioexportconfiguration.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,13 @@ class IAudioExportConfiguration : MODULE_EXPORT_INTERFACE
4646
virtual const std::vector<int>& availableSampleRates() const = 0;
4747

4848
virtual muse::audio::samples_t exportBufferSize() const = 0;
49+
50+
virtual muse::audio::AudioSampleFormat exportSampleFormat() const = 0;
51+
virtual void setExportSampleFormat(muse::audio::AudioSampleFormat format) = 0;
52+
virtual void setExportSampleFormat(const QString& extension, muse::audio::AudioSampleFormat format) = 0;
53+
virtual const std::vector<muse::audio::AudioSampleFormat>& availableSampleFormats(const QString& extension) const = 0;
54+
virtual QString sampleFormatToString(muse::audio::AudioSampleFormat format) const = 0;
55+
virtual void loadSampleFormatSetting(const QString& extension) = 0;
4956
};
5057
}
5158

src/importexport/audioexport/internal/audioexportconfiguration.cpp

Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
#include "audioexportconfiguration.h"
2424

2525
#include "settings.h"
26+
#include "translation.h"
2627

2728
using namespace muse;
2829
using namespace mu;
@@ -31,11 +32,15 @@ using namespace muse::audio;
3132

3233
static const Settings::Key EXPORT_SAMPLE_RATE_KEY("iex_audioexport", "export/audio/sampleRate");
3334
static const Settings::Key EXPORT_MP3_BITRATE("iex_audioexport", "export/audio/mp3Bitrate");
35+
static const Settings::Key EXPORT_WAV_SAMPLE_FORMAT_KEY("iex_audioexport", "export/audio/wavSampleFormat");
36+
static const Settings::Key EXPORT_FLAC_SAMPLE_FORMAT_KEY("iex_audioexport", "export/audio/flacSampleFormat");
3437

3538
void AudioExportConfiguration::init()
3639
{
3740
settings()->setDefaultValue(EXPORT_SAMPLE_RATE_KEY, Val(44100));
3841
settings()->setDefaultValue(EXPORT_MP3_BITRATE, Val(128));
42+
settings()->setDefaultValue(EXPORT_WAV_SAMPLE_FORMAT_KEY, Val(static_cast<int>(AudioSampleFormat::Float32)));
43+
settings()->setDefaultValue(EXPORT_FLAC_SAMPLE_FORMAT_KEY, Val(static_cast<int>(AudioSampleFormat::Int16)));
3944
}
4045

4146
int AudioExportConfiguration::exportMp3Bitrate() const
@@ -79,3 +84,67 @@ samples_t AudioExportConfiguration::exportBufferSize() const
7984
{
8085
return 4096;
8186
}
87+
88+
AudioSampleFormat AudioExportConfiguration::exportSampleFormat() const
89+
{
90+
return m_exportSampleFormat;
91+
}
92+
93+
void AudioExportConfiguration::setExportSampleFormat(AudioSampleFormat format)
94+
{
95+
m_exportSampleFormat = format;
96+
}
97+
98+
void AudioExportConfiguration::setExportSampleFormat(const QString& extension, AudioSampleFormat format)
99+
{
100+
m_exportSampleFormat = format;
101+
if (extension == QLatin1String("wav")) {
102+
settings()->setSharedValue(EXPORT_WAV_SAMPLE_FORMAT_KEY, Val(static_cast<int>(format)));
103+
} else if (extension == QLatin1String("flac")) {
104+
settings()->setSharedValue(EXPORT_FLAC_SAMPLE_FORMAT_KEY, Val(static_cast<int>(format)));
105+
}
106+
}
107+
108+
const std::vector<AudioSampleFormat>& AudioExportConfiguration::availableSampleFormats(const QString& extension) const
109+
{
110+
if (extension == QLatin1String("wav")) {
111+
static const std::vector<muse::audio::AudioSampleFormat> wavSampleFormats {
112+
AudioSampleFormat::Int16,
113+
AudioSampleFormat::Int24,
114+
AudioSampleFormat::Float32,
115+
};
116+
return wavSampleFormats;
117+
}
118+
if (extension == QLatin1String("flac")) {
119+
static const std::vector<muse::audio::AudioSampleFormat> flacSampleFormats {
120+
AudioSampleFormat::Int16,
121+
AudioSampleFormat::Int24,
122+
};
123+
return flacSampleFormats;
124+
}
125+
static const std::vector<muse::audio::AudioSampleFormat> emptySampleFormats {};
126+
return emptySampleFormats;
127+
}
128+
129+
void AudioExportConfiguration::loadSampleFormatSetting(const QString& extension)
130+
{
131+
if (extension == QLatin1String("wav")) {
132+
setExportSampleFormat(static_cast<AudioSampleFormat>(settings()->value(EXPORT_WAV_SAMPLE_FORMAT_KEY).toInt()));
133+
} else if (extension == QLatin1String("flac")) {
134+
setExportSampleFormat(static_cast<AudioSampleFormat>(settings()->value(EXPORT_FLAC_SAMPLE_FORMAT_KEY).toInt()));
135+
}
136+
}
137+
138+
QString AudioExportConfiguration::sampleFormatToString(AudioSampleFormat format) const
139+
{
140+
switch (format) {
141+
case AudioSampleFormat::Int16:
142+
return muse::qtrc("project/export", "16-bit integer");
143+
case AudioSampleFormat::Int24:
144+
return muse::qtrc("project/export", "24-bit integer");
145+
case AudioSampleFormat::Float32:
146+
return muse::qtrc("project/export", "32-bit float");
147+
default:
148+
return QString();
149+
}
150+
}

src/importexport/audioexport/internal/audioexportconfiguration.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,8 +41,16 @@ class AudioExportConfiguration : public IAudioExportConfiguration
4141

4242
muse::audio::samples_t exportBufferSize() const override;
4343

44+
muse::audio::AudioSampleFormat exportSampleFormat() const override;
45+
void setExportSampleFormat(muse::audio::AudioSampleFormat format) override;
46+
void setExportSampleFormat(const QString& extension, muse::audio::AudioSampleFormat format) override;
47+
const std::vector<muse::audio::AudioSampleFormat>& availableSampleFormats(const QString& extension) const override;
48+
QString sampleFormatToString(muse::audio::AudioSampleFormat format) const override;
49+
void loadSampleFormatSetting(const QString& extension) override;
50+
4451
private:
4552
std::optional<int> m_exportMp3BitrateOverride = std::nullopt;
53+
muse::audio::AudioSampleFormat m_exportSampleFormat;
4654
};
4755
}
4856

src/importexport/audioexport/internal/flacwriter.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ muse::Ret FlacWriter::write(notation::INotationPtr notation, muse::io::IODevice&
3737
configuration()->exportBufferSize(),
3838
2 /* audioChannelsNumber */
3939
},
40-
AudioSampleFormat::Int16,
40+
configuration()->exportSampleFormat(),
4141
0 /* bitRate */
4242
};
4343

src/importexport/audioexport/internal/wavewriter.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ Ret WaveWriter::write(notation::INotationPtr notation, io::IODevice& destination
3737
configuration()->exportBufferSize(),
3838
2 /* audioChannelsNumber */
3939
},
40-
AudioSampleFormat::Float32,
40+
configuration()->exportSampleFormat(),
4141
0 /* bitRate */
4242
};
4343

src/project/qml/MuseScore/Project/internal/Export/AudioSettingsPage.qml

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,29 @@ ExportSettingsPage {
8282
}
8383
}
8484

85+
ExportOptionItem {
86+
id: sampleFormatLabel
87+
visible: model.availableSampleFormats.length > 0
88+
text: qsTrc("project/export", "Sample format:")
89+
90+
StyledDropdown {
91+
Layout.preferredWidth: 126
92+
93+
navigation.name: "SampleFormatsDropdown"
94+
navigation.panel: root.navigationPanel
95+
navigation.row: root.navigationOrder + 3
96+
navigation.accessible.name: sampleFormatLabel.text + " " + currentText
97+
98+
model: root.model.availableSampleFormats
99+
100+
currentIndex: indexOfValue(root.model.selectedSampleFormat)
101+
102+
onActivated: function(index, value) {
103+
root.model.selectedSampleFormat = value
104+
}
105+
}
106+
}
107+
85108
StyledTextLabel {
86109
width: parent.width
87110
text: qsTrc("project/export", "Each selected part will be exported as a separate audio file.")

src/project/view/exportdialogmodel.cpp

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -266,7 +266,11 @@ void ExportDialogModel::setExportType(const ExportType& type)
266266

267267
m_selectedExportType = type;
268268

269+
audioExportConfiguration()->loadSampleFormatSetting(type.suffixes[0]);
270+
269271
emit selectedExportTypeChanged(type.toMap());
272+
emit availableSampleFormatsChanged();
273+
emit selectedSampleFormatChanged();
270274

271275
std::vector<UnitType> unitTypes = exportProjectScenario()->supportedUnitTypes(type);
272276

@@ -728,3 +732,32 @@ void ExportDialogModel::updateExportInfo()
728732

729733
exportProjectScenario()->setExportInfo(info);
730734
}
735+
736+
QVariantList ExportDialogModel::availableSampleFormats() const
737+
{
738+
const auto& formats = audioExportConfiguration()->availableSampleFormats(m_selectedExportType.suffixes[0]);
739+
QVariantList result;
740+
for (const auto& format : formats) {
741+
QVariantMap obj;
742+
obj["text"] = audioExportConfiguration()->sampleFormatToString(format);
743+
obj["value"] = static_cast<int>(format);
744+
result << obj;
745+
}
746+
return result;
747+
}
748+
749+
int ExportDialogModel::selectedSampleFormat() const
750+
{
751+
return static_cast<int>(audioExportConfiguration()->exportSampleFormat());
752+
}
753+
754+
void ExportDialogModel::setSelectedSampleFormat(int format)
755+
{
756+
const auto audioFormat = static_cast<muse::audio::AudioSampleFormat>(format);
757+
if (audioFormat == audioExportConfiguration()->exportSampleFormat()) {
758+
return;
759+
}
760+
761+
audioExportConfiguration()->setExportSampleFormat(m_selectedExportType.suffixes[0], audioFormat);
762+
emit selectedSampleFormatChanged();
763+
}

src/project/view/exportdialogmodel.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,8 @@ class ExportDialogModel : public QAbstractListModel, public muse::async::Asyncab
8383

8484
Q_PROPERTY(int sampleRate READ sampleRate WRITE setSampleRate NOTIFY sampleRateChanged)
8585
Q_PROPERTY(int bitRate READ bitRate WRITE setBitRate NOTIFY bitRateChanged)
86+
Q_PROPERTY(QVariantList availableSampleFormats READ availableSampleFormats NOTIFY availableSampleFormatsChanged)
87+
Q_PROPERTY(int selectedSampleFormat READ selectedSampleFormat WRITE setSelectedSampleFormat NOTIFY selectedSampleFormatChanged)
8688

8789
Q_PROPERTY(bool midiExpandRepeats READ midiExpandRepeats WRITE setMidiExpandRepeats NOTIFY midiExpandRepeatsChanged)
8890
Q_PROPERTY(bool midiExportRpns READ midiExportRpns WRITE setMidiExportRpns NOTIFY midiExportRpnsChanged)
@@ -154,6 +156,10 @@ class ExportDialogModel : public QAbstractListModel, public muse::async::Asyncab
154156
int bitRate() const;
155157
void setBitRate(int bitRate);
156158

159+
QVariantList availableSampleFormats() const;
160+
int selectedSampleFormat() const;
161+
void setSelectedSampleFormat(int format);
162+
157163
bool midiExpandRepeats() const;
158164
void setMidiExpandRepeats(bool expandRepeats);
159165

@@ -204,6 +210,8 @@ class ExportDialogModel : public QAbstractListModel, public muse::async::Asyncab
204210
void sampleRateChanged(int sampleRate);
205211
void availableBitRatesChanged();
206212
void bitRateChanged(int bitRate);
213+
void availableSampleFormatsChanged();
214+
void selectedSampleFormatChanged();
207215

208216
void midiExpandRepeatsChanged(bool expandRepeats);
209217
void midiExportRpnsChanged(bool exportRpns);

0 commit comments

Comments
 (0)