mixer/plugins/volume_mapping: convert to C++
This commit is contained in:
parent
5b41857a22
commit
5b7a89d714
@ -2,6 +2,7 @@
|
|||||||
// Copyright The Music Player Daemon Project
|
// Copyright The Music Player Daemon Project
|
||||||
|
|
||||||
#include "AlsaMixerPlugin.hxx"
|
#include "AlsaMixerPlugin.hxx"
|
||||||
|
#include "VolumeMapping.hxx"
|
||||||
#include "lib/alsa/NonBlock.hxx"
|
#include "lib/alsa/NonBlock.hxx"
|
||||||
#include "lib/alsa/Error.hxx"
|
#include "lib/alsa/Error.hxx"
|
||||||
#include "lib/fmt/RuntimeError.hxx"
|
#include "lib/fmt/RuntimeError.hxx"
|
||||||
@ -17,10 +18,6 @@
|
|||||||
#include "util/Math.hxx"
|
#include "util/Math.hxx"
|
||||||
#include "Log.hxx"
|
#include "Log.hxx"
|
||||||
|
|
||||||
extern "C" {
|
|
||||||
#include "volume_mapping.h"
|
|
||||||
}
|
|
||||||
|
|
||||||
#include <alsa/asoundlib.h>
|
#include <alsa/asoundlib.h>
|
||||||
|
|
||||||
#define VOLUME_MIXER_ALSA_DEFAULT "default"
|
#define VOLUME_MIXER_ALSA_DEFAULT "default"
|
||||||
|
@ -17,18 +17,19 @@
|
|||||||
* -1/0/1 = down/nearest/up.
|
* -1/0/1 = down/nearest/up.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include "VolumeMapping.hxx"
|
||||||
|
|
||||||
#include <math.h>
|
#include <math.h>
|
||||||
#include <stdbool.h>
|
|
||||||
#include "volume_mapping.h"
|
|
||||||
|
|
||||||
#define MAX_LINEAR_DB_SCALE 24
|
#define MAX_LINEAR_DB_SCALE 24
|
||||||
|
|
||||||
static inline bool use_linear_dB_scale(long dBmin, long dBmax)
|
static constexpr bool use_linear_dB_scale(long dBmin, long dBmax) noexcept
|
||||||
{
|
{
|
||||||
return dBmax - dBmin <= MAX_LINEAR_DB_SCALE * 100;
|
return dBmax - dBmin <= MAX_LINEAR_DB_SCALE * 100;
|
||||||
}
|
}
|
||||||
|
|
||||||
static long lrint_dir(double x, int dir)
|
[[gnu::const]]
|
||||||
|
static long lrint_dir(double x, int dir) noexcept
|
||||||
{
|
{
|
||||||
if (dir > 0)
|
if (dir > 0)
|
||||||
return lrint(ceil(x));
|
return lrint(ceil(x));
|
||||||
@ -40,34 +41,41 @@ static long lrint_dir(double x, int dir)
|
|||||||
|
|
||||||
enum ctl_dir { PLAYBACK, CAPTURE };
|
enum ctl_dir { PLAYBACK, CAPTURE };
|
||||||
|
|
||||||
static int (* const get_dB_range[2])(snd_mixer_elem_t *, long *, long *) = {
|
static constexpr int (* const get_dB_range[2])(snd_mixer_elem_t *, long *, long *) = {
|
||||||
snd_mixer_selem_get_playback_dB_range,
|
snd_mixer_selem_get_playback_dB_range,
|
||||||
snd_mixer_selem_get_capture_dB_range,
|
snd_mixer_selem_get_capture_dB_range,
|
||||||
};
|
};
|
||||||
static int (* const get_raw_range[2])(snd_mixer_elem_t *, long *, long *) = {
|
|
||||||
|
static constexpr int (* const get_raw_range[2])(snd_mixer_elem_t *, long *, long *) = {
|
||||||
snd_mixer_selem_get_playback_volume_range,
|
snd_mixer_selem_get_playback_volume_range,
|
||||||
snd_mixer_selem_get_capture_volume_range,
|
snd_mixer_selem_get_capture_volume_range,
|
||||||
};
|
};
|
||||||
static int (* const get_dB[2])(snd_mixer_elem_t *, snd_mixer_selem_channel_id_t, long *) = {
|
|
||||||
|
static constexpr int (* const get_dB[2])(snd_mixer_elem_t *, snd_mixer_selem_channel_id_t, long *) = {
|
||||||
snd_mixer_selem_get_playback_dB,
|
snd_mixer_selem_get_playback_dB,
|
||||||
snd_mixer_selem_get_capture_dB,
|
snd_mixer_selem_get_capture_dB,
|
||||||
};
|
};
|
||||||
static int (* const get_raw[2])(snd_mixer_elem_t *, snd_mixer_selem_channel_id_t, long *) = {
|
|
||||||
|
static constexpr int (* const get_raw[2])(snd_mixer_elem_t *, snd_mixer_selem_channel_id_t, long *) = {
|
||||||
snd_mixer_selem_get_playback_volume,
|
snd_mixer_selem_get_playback_volume,
|
||||||
snd_mixer_selem_get_capture_volume,
|
snd_mixer_selem_get_capture_volume,
|
||||||
};
|
};
|
||||||
static int (* const set_dB[2])(snd_mixer_elem_t *, long, int) = {
|
|
||||||
|
static constexpr int (* const set_dB[2])(snd_mixer_elem_t *, long, int) = {
|
||||||
snd_mixer_selem_set_playback_dB_all,
|
snd_mixer_selem_set_playback_dB_all,
|
||||||
snd_mixer_selem_set_capture_dB_all,
|
snd_mixer_selem_set_capture_dB_all,
|
||||||
};
|
};
|
||||||
static int (* const set_raw[2])(snd_mixer_elem_t *, long) = {
|
|
||||||
|
static constexpr int (* const set_raw[2])(snd_mixer_elem_t *, long) = {
|
||||||
snd_mixer_selem_set_playback_volume_all,
|
snd_mixer_selem_set_playback_volume_all,
|
||||||
snd_mixer_selem_set_capture_volume_all,
|
snd_mixer_selem_set_capture_volume_all,
|
||||||
};
|
};
|
||||||
|
|
||||||
static double get_normalized_volume(snd_mixer_elem_t *elem,
|
[[gnu::pure]]
|
||||||
snd_mixer_selem_channel_id_t channel,
|
static double
|
||||||
enum ctl_dir ctl_dir)
|
get_normalized_volume(snd_mixer_elem_t *elem,
|
||||||
|
snd_mixer_selem_channel_id_t channel,
|
||||||
|
enum ctl_dir ctl_dir) noexcept
|
||||||
{
|
{
|
||||||
long min, max, value;
|
long min, max, value;
|
||||||
double normalized, min_norm;
|
double normalized, min_norm;
|
||||||
@ -102,10 +110,11 @@ static double get_normalized_volume(snd_mixer_elem_t *elem,
|
|||||||
return normalized;
|
return normalized;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int set_normalized_volume(snd_mixer_elem_t *elem,
|
static int
|
||||||
double volume,
|
set_normalized_volume(snd_mixer_elem_t *elem,
|
||||||
int dir,
|
double volume,
|
||||||
enum ctl_dir ctl_dir)
|
int dir,
|
||||||
|
enum ctl_dir ctl_dir) noexcept
|
||||||
{
|
{
|
||||||
long min, max, value;
|
long min, max, value;
|
||||||
double min_norm;
|
double min_norm;
|
||||||
@ -148,29 +157,32 @@ static int set_normalized_volume(snd_mixer_elem_t *elem,
|
|||||||
return set_dB[ctl_dir](elem, value, dir);
|
return set_dB[ctl_dir](elem, value, dir);
|
||||||
}
|
}
|
||||||
|
|
||||||
double get_normalized_playback_volume(snd_mixer_elem_t *elem,
|
double
|
||||||
snd_mixer_selem_channel_id_t channel)
|
get_normalized_playback_volume(snd_mixer_elem_t *elem,
|
||||||
|
snd_mixer_selem_channel_id_t channel) noexcept
|
||||||
{
|
{
|
||||||
return get_normalized_volume(elem, channel, PLAYBACK);
|
return get_normalized_volume(elem, channel, PLAYBACK);
|
||||||
}
|
}
|
||||||
|
|
||||||
double get_normalized_capture_volume(snd_mixer_elem_t *elem,
|
double
|
||||||
snd_mixer_selem_channel_id_t channel)
|
get_normalized_capture_volume(snd_mixer_elem_t *elem,
|
||||||
|
snd_mixer_selem_channel_id_t channel) noexcept
|
||||||
{
|
{
|
||||||
return get_normalized_volume(elem, channel, CAPTURE);
|
return get_normalized_volume(elem, channel, CAPTURE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int
|
||||||
int set_normalized_playback_volume(snd_mixer_elem_t *elem,
|
set_normalized_playback_volume(snd_mixer_elem_t *elem,
|
||||||
double volume,
|
double volume,
|
||||||
int dir)
|
int dir) noexcept
|
||||||
{
|
{
|
||||||
return set_normalized_volume(elem, volume, dir, PLAYBACK);
|
return set_normalized_volume(elem, volume, dir, PLAYBACK);
|
||||||
}
|
}
|
||||||
|
|
||||||
int set_normalized_capture_volume(snd_mixer_elem_t *elem,
|
int
|
||||||
double volume,
|
set_normalized_capture_volume(snd_mixer_elem_t *elem,
|
||||||
int dir)
|
double volume,
|
||||||
|
int dir) noexcept
|
||||||
{
|
{
|
||||||
return set_normalized_volume(elem, volume, dir, CAPTURE);
|
return set_normalized_volume(elem, volume, dir, CAPTURE);
|
||||||
}
|
}
|
25
src/mixer/plugins/VolumeMapping.hxx
Normal file
25
src/mixer/plugins/VolumeMapping.hxx
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
// SPDX-License-Identifier: ISC
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <alsa/asoundlib.h>
|
||||||
|
|
||||||
|
[[gnu::pure]]
|
||||||
|
double
|
||||||
|
get_normalized_playback_volume(snd_mixer_elem_t *elem,
|
||||||
|
snd_mixer_selem_channel_id_t channel) noexcept;
|
||||||
|
|
||||||
|
[[gnu::pure]]
|
||||||
|
double
|
||||||
|
get_normalized_capture_volume(snd_mixer_elem_t *elem,
|
||||||
|
snd_mixer_selem_channel_id_t channel) noexcept;
|
||||||
|
|
||||||
|
int
|
||||||
|
set_normalized_playback_volume(snd_mixer_elem_t *elem,
|
||||||
|
double volume,
|
||||||
|
int dir) noexcept;
|
||||||
|
|
||||||
|
int
|
||||||
|
set_normalized_capture_volume(snd_mixer_elem_t *elem,
|
||||||
|
double volume,
|
||||||
|
int dir) noexcept;
|
@ -6,7 +6,7 @@ mixer_plugins_sources = [
|
|||||||
if alsa_dep.found()
|
if alsa_dep.found()
|
||||||
mixer_plugins_sources += [
|
mixer_plugins_sources += [
|
||||||
'AlsaMixerPlugin.cxx',
|
'AlsaMixerPlugin.cxx',
|
||||||
'volume_mapping.c',
|
'VolumeMapping.cxx',
|
||||||
]
|
]
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
@ -1,16 +0,0 @@
|
|||||||
// SPDX-License-Identifier: ISC
|
|
||||||
|
|
||||||
#pragma once
|
|
||||||
|
|
||||||
#include <alsa/asoundlib.h>
|
|
||||||
|
|
||||||
double get_normalized_playback_volume(snd_mixer_elem_t *elem,
|
|
||||||
snd_mixer_selem_channel_id_t channel);
|
|
||||||
double get_normalized_capture_volume(snd_mixer_elem_t *elem,
|
|
||||||
snd_mixer_selem_channel_id_t channel);
|
|
||||||
int set_normalized_playback_volume(snd_mixer_elem_t *elem,
|
|
||||||
double volume,
|
|
||||||
int dir);
|
|
||||||
int set_normalized_capture_volume(snd_mixer_elem_t *elem,
|
|
||||||
double volume,
|
|
||||||
int dir);
|
|
Loading…
Reference in New Issue
Block a user