Создание субканала PCM микшера
#include <audio_driver.h>ado_pcm_subchn_mixer_t * ado_pcm_subchn_mixer_create( ado_pcm_subchn_t *subchn,ado_mixer_t *mixer,ado_pcm_subchn_mixer_config_t *config );
libado
Функция ado_pcm_subchn_mixer_create() позволяет создать элементы микшера и callback-функции для управления громкостью в субканале PCM устройства. Если поддерживается одновременная работа с более чем одним субканалом и имеется возможность управлять громкостью и отключением звука (mute) для каждого субканала, данная функция упростит управление ими.
Указатель на созданный субканал микшера или NULL
, если возникла ошибка (также устанавливается errno).
![]() | Структура ado_pcm_subchn_mixer_t является прозрачной для драйвера. Указатель на нее потребуется для освобождения ресурсов для созданного субканала микшера с помощью ado_pcm_subchn_mixer_destroy(). |
Пример настройки субканала микшера. В данном случае имеются индивидуальные элементы контроля над громкостью и отключением (mute) для каждого канала стерео потока. Громкость регулируется в диапазоне от 0
до 255
, что в децибелах соответствует диапазону от -102.35 dB до 0 dB.
Функции vortex_mixer_input_gain() и vortex_mixer_input_mute() позволяют отключать звук и настраивать громкость. Но для работы они должны определить, через какой аппаратный микшер и его вход проходят сигналы, что достижимо через поле *vsc структуры PCM_SUBCHN_CONTEXT_T
.
static void vortex_subchn_volume_set( HW_CONTEXT_T *vortex, PCM_SUBCHN_CONTEXT_T *vsc, int32_t *volumes,int32_t mute, ado_pcm_subchn_mixer_config_t *config ){if ( vortex->card_type == VORTEX_CARD_TYPE_AU8830 ){vortex_mixer_input_gain_8830( vortex, vsc->mixL, vsc->mixinL, volumes[0] );vortex_mixer_input_gain_8830( vortex, vsc->mixR, vsc->mixinR, volumes[1] );} else {vortex_mixer_input_gain_8820( vortex, vsc->mixL, vsc->mixinL, volumes[0] );vortex_mixer_input_gain_8820( vortex, vsc->mixR, vsc->mixinR, volumes[1] );}}static void vortex_subchn_mute_set( HW_CONTEXT_T *vortex, PCM_SUBCHN_CONTEXT_T *vsc, int32_t *volumes,int32_t mute, ado_pcm_subchn_mixer_config_t *config ){if ( vortex->card_type == VORTEX_CARD_TYPE_AU8830 ){vortex_mixer_input_mute_8830( vortex, vsc->mixL, vsc->mixinL, mute & (1 << 0) );vortex_mixer_input_mute_8830( vortex, vsc->mixR, vsc->mixinR, mute & (1 << 1) );} else {vortex_mixer_input_mute_8820( vortex, vsc->mixL, vsc->mixinL, mute & (1 << 0) );vortex_mixer_input_mute_8820( vortex, vsc->mixR, vsc->mixinR, mute & (1 << 1) );}}int32_t vortex_playback_aquire( HW_CONTEXT_T *vortex, PCM_SUBCHN_CONTEXT_T **vsc, ado_pcm_config_t *config,ado_pcm_subchn_t *subchn, uint32_t *why_failed ){...memset( &vsc_mix_cfg, 0, sizeof( vsc_mix_cfg ) );vsc_mix_cfg.hw_context = vortex;vsc_mix_cfg.pcm_sc_context = *vsc;vsc_mix_cfg.channel_mask = SND_MIXER_CHN_MASK_STEREO;vsc_mix_cfg.volume_range.min = 0;vsc_mix_cfg.volume_range.max = 0xff;vsc_mix_cfg.volume_range.min_dB = -10235;vsc_mix_cfg.volume_range.max_dB = 0;vsc_mix_cfg.volume_set = vortex_subchn_volume_set;vsc_mix_cfg.mute_set = vortex_subchn_mute_set;if ( ((*vsc)->scmix = ado_pcm_subchn_mixer_create( subchn, vortex->mixer, &vsc_mix_cfg )) == NULL ){return (ENOMEM);}...}int32_t vortex_playback_release( HW_CONTEXT_T *vortex, PCM_SUBCHN_CONTEXT_T *vsc, ado_pcm_config_t *config ){...ado_pcm_subchn_mixer_destroy( vsc->scmix );...}
ЗОСРВ «Нейтрино»
ado_pcm_subchn_mixer_config_t, ado_pcm_subchn_mixer_destroy()
Предыдущий раздел: Библиотека libado