pcm/Volume: Open() returns output sample format
Prepare for a new mode which may convert to a different sample format when applying volume, to reduce dithering.
This commit is contained in:
parent
1c757f8c1c
commit
5fa7610264
@ -77,7 +77,7 @@ public:
|
|||||||
mixer(_mixer), base(_base) {
|
mixer(_mixer), base(_base) {
|
||||||
info.Clear();
|
info.Clear();
|
||||||
|
|
||||||
pv.Open(out_audio_format.format);
|
out_audio_format.format = pv.Open(out_audio_format.format);
|
||||||
}
|
}
|
||||||
|
|
||||||
void SetInfo(const ReplayGainInfo *_info) {
|
void SetInfo(const ReplayGainInfo *_info) {
|
||||||
|
@ -30,7 +30,7 @@ class VolumeFilter final : public Filter {
|
|||||||
public:
|
public:
|
||||||
explicit VolumeFilter(const AudioFormat &audio_format)
|
explicit VolumeFilter(const AudioFormat &audio_format)
|
||||||
:Filter(audio_format) {
|
:Filter(audio_format) {
|
||||||
pv.Open(out_audio_format.format);
|
out_audio_format.format = pv.Open(out_audio_format.format);
|
||||||
}
|
}
|
||||||
|
|
||||||
unsigned GetVolume() const noexcept {
|
unsigned GetVolume() const noexcept {
|
||||||
|
@ -96,7 +96,7 @@ pcm_volume_change_float(float *dest, const float *src, size_t n,
|
|||||||
dest[i] = src[i] * volume;
|
dest[i] = src[i] * volume;
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
SampleFormat
|
||||||
PcmVolume::Open(SampleFormat _format)
|
PcmVolume::Open(SampleFormat _format)
|
||||||
{
|
{
|
||||||
assert(format == SampleFormat::UNDEFINED);
|
assert(format == SampleFormat::UNDEFINED);
|
||||||
@ -118,7 +118,7 @@ PcmVolume::Open(SampleFormat _format)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
format = _format;
|
return format = _format;
|
||||||
}
|
}
|
||||||
|
|
||||||
ConstBuffer<void>
|
ConstBuffer<void>
|
||||||
|
@ -94,9 +94,10 @@ public:
|
|||||||
*
|
*
|
||||||
* Throws on error.
|
* Throws on error.
|
||||||
*
|
*
|
||||||
* @param format the sample format
|
* @param format the input sample format
|
||||||
|
* @return the output sample format
|
||||||
*/
|
*/
|
||||||
void Open(SampleFormat format);
|
SampleFormat Open(SampleFormat format);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Closes the object. After that, you may call Open() again.
|
* Closes the object. After that, you may call Open() again.
|
||||||
|
@ -50,7 +50,11 @@ try {
|
|||||||
audio_format = ParseAudioFormat(argv[1], false);
|
audio_format = ParseAudioFormat(argv[1], false);
|
||||||
|
|
||||||
PcmVolume pv;
|
PcmVolume pv;
|
||||||
pv.Open(audio_format.format);
|
const auto out_sample_format = pv.Open(audio_format.format);
|
||||||
|
|
||||||
|
if (out_sample_format != audio_format.format)
|
||||||
|
fprintf(stderr, "Converting to %s\n",
|
||||||
|
sample_format_to_string(out_sample_format));
|
||||||
|
|
||||||
while ((nbytes = read(0, buffer, sizeof(buffer))) > 0) {
|
while ((nbytes = read(0, buffer, sizeof(buffer))) > 0) {
|
||||||
auto dest = pv.Apply({buffer, size_t(nbytes)});
|
auto dest = pv.Apply({buffer, size_t(nbytes)});
|
||||||
|
@ -36,7 +36,7 @@ TestVolume(G g=G())
|
|||||||
typedef typename Traits::value_type value_type;
|
typedef typename Traits::value_type value_type;
|
||||||
|
|
||||||
PcmVolume pv;
|
PcmVolume pv;
|
||||||
pv.Open(F);
|
EXPECT_EQ(pv.Open(F), F);
|
||||||
|
|
||||||
constexpr size_t N = 509;
|
constexpr size_t N = 509;
|
||||||
static value_type zero[N];
|
static value_type zero[N];
|
||||||
|
Loading…
Reference in New Issue
Block a user