ado_pcm_subchn_mixer_create()

Создание субканала 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 );

Аргументы:

subchn
Субканал для ассоциирования с микшером.
mixer
Микшер для присоединения новых элементов управления.
config
Указатель на структуру ado_pcm_subchn_mixer_config_t, которая описывает тип элементов управления оборудованием.

Библиотека:

libado

Описание:

Функция ado_pcm_subchn_mixer_create() позволяет создать элементы микшера и callback-функции для управления громкостью в субканале PCM устройства. Если поддерживается одновременная работа с более чем одним субканалом и имеется возможность управлять громкостью и отключением звука (mute) для каждого субканала, данная функция упростит управление ими.

Возвращаемое значение:

Указатель на созданный субканал микшера или NULL, если возникла ошибка (также устанавливается errno).


Note: Структура 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