LINUX.ORG.RU

Выставление звука ALSA.

 , ,


0

1

Такие дела. Для выставления звука в процентах на PCM юзаю следующий код:

void set_volume(int volume){
    long min, max;
    snd_mixer_t *handle;
    snd_mixer_selem_id_t *sid;
    const char *card = "default";
    const char *selem_name = "PCM";

    snd_mixer_open(&handle, 0);
    snd_mixer_attach(handle, card);
    snd_mixer_selem_register(handle, NULL, NULL);
    snd_mixer_load(handle);

    snd_mixer_selem_id_alloca(&sid);
    snd_mixer_selem_id_set_index(sid, 0);
    snd_mixer_selem_id_set_name(sid, selem_name);
    snd_mixer_elem_t* elem = snd_mixer_find_selem(handle, sid);

    snd_mixer_selem_get_playback_volume_range(elem, &min, &max);
    snd_mixer_selem_set_playback_volume_all(elem, 90 * (max) / 100);
    printf("%d, %d", min, max);
    
    snd_mixer_close(handle);
}

Он нормально работает с PCM, ибо у него предел == 255, что есть больше 100.

[nikita@laptop ~]$ amixer get PCM
Simple mixer control 'PCM',0
  Capabilities: pvolume
  Playback channels: Front Left - Front Right
  Limits: Playback 0 - 255
  Mono:
  Front Left: Playback 255 [100%] [0.00dB]
  Front Right: Playback 255 [100%] [0.00dB]
Но у Master предел == 64. От этого выставление проходит, мягко говоря, коряво... amixer тоже выставляет и получает не верно, если ставить процентами на мастере.
[nikita@laptop ~]$ amixer get Master
Simple mixer control 'Master',0
  Capabilities: pvolume pvolume-joined pswitch pswitch-joined
  Playback channels: Mono
  Limits: Playback 0 - 64
  Mono: Playback 58 [91%] [-6.00dB] [on]
На самом деле звук стоит на 78%. Понять не могу, то ли альза криво стала после сноса пульса, то ли я что-то не так делаю. Вопросы: Как можно выставить звук нормально на мастере(на примере куска сишного кода)? У всех предел на мастере 64?


У всех предел на мастере 64?

Limits: Playback 0 - 65536

Как можно выставить звук нормально на мастере

Сначала спросить у него максимальное значение?

Gvidon ★★★★
()
Ответ на: комментарий от Gvidon

У тебя пульс? Я у него спросил, он мне сказал, что 64... Смотрел сырцы volumeicon, та как-то иначе сделано, но там черт ногу сломит.

Yaourt
() автор топика
Ответ на: комментарий от Yaourt

У тебя пульс?

Да, а тебе в твоей реализации это принципиально?

Я у него спросил, он мне сказал, что 64

И в чём проблема дальше? Ты не можешь перевести отрезок [0, n] в проценты и наоборот?

Gvidon ★★★★
()
Ответ на: комментарий от Gvidon

Не принципиально, просто в пульсе такой большой предел.

Перевести не трудно, но чтобы получить, например, 99% - нужно юзать дробное число, а его не хавает ни amixer, ни api.

Yaourt
() автор топика

Это аппаратные пределы. У тебя все правильно. Pulse alsa plugin дает 65к, не знаю как там сделано, но это либо softvolume, либо оно также в твоем коде преобразуется в аппаратные 64. Выйти за пределы 64 можно только сменив звуковую карту, или делая softvolume.

fopen ★★
()

У всех предел на мастере 64?

у меня 0 - 31. Для выставления звука использую хоткеи

amixer sset Master,0 1+
amixer sset Master,0 1-

Deleted
()
Ответ на: комментарий от fopen

Ссылка годная. Займусь, как время будет. Нужно еще разобраться, как программно создать виртуальный девайс.

Yaourt
() автор топика
Ответ на: комментарий от NegatiV

Оно работает, но не корректно. То есть, если предел у девайса > 100, то все нормально, если меньше, то значения неверные выставляются.

Yaourt
() автор топика
Ответ на: комментарий от NegatiV

Разобрался. В volume_mapping.h есть такая кавайная функция: set_normalized_playback_volume. В ней процентами нормально можно ставить, но там тоже пару движений надо сделать, но все же лучше, чем было.

Yaourt
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.