Fade out MOC se outro aplicativo começar a tocar algo

0

Eu preciso encontrar uma boa maneira de forçar o desvanecimento da reprodução de som de um moc daemon

Eu tenho o seguinte cenário:

Eu tenho uma pequena caixa de servidores Ubuntu 12.04 com um daemon MOC (musiconconsole) e um aplicativo ruby personalizado.

O aplicativo ruby ocasionalmente reproduz um wav ou outro soundfile em cenários periódicos ou orientados a eventos. por exemplo. às 7 horas da noite. ele toca "store_is_closing.mp3" ou algo parecido.

Eu também tenho um daemon MOC rodando com uma lista de reprodução de mp3, que toca música o dia todo.

Estou usando o ALSA para fazer a mixagem.

Tudo funciona bem, mas sinto falta de um ponto.

Se, digamos, o MOC estiver tocando uma música e o app ruby tocar um arquivo de som, tudo estará no mesmo nível de som (obviamente). então, você não entende nada do arquivo de som reproduzido pelo aplicativo ruby.

Eu preciso encontrar uma maneira de forçar o daemon MOC a diminuir sua reprodução da música para uma porcentagem definida (digamos que 10% do nível de som original) e depois que o app ruby tocou o arquivo de som, moc deve ser voltou para o nível de som de origem.

    
por Ello 12.11.2013 / 11:49

1 resposta

0

O daemon MOC pode ser controlado apenas com o cliente mocp .

Se você estivesse usando o PulseAudio, você poderia usar pacmd para alterar o volume do MOC.

Se você substituiu o MOC pelo MPD , você pode usar mpc para alterar o volume do MPD.

Se você realmente quiser fazer isso com o ALSA, poderá colocar o seguinte em /etc/asound.conf :

pcm.moc_with_volume {
    type softvol
    slave.pcm "default"  # or whatever you're using in MOC
    control {
        name "MOC Playback Volume"
        count 1
    }
}

e configure o MOC para usar o nome do dispositivo ALSA moc_with_volume em vez de default .

Se o seu programa de mudança de volume não permitir configurar o controle do mixer, você deverá monitorar o outro controle do mixer e copiar seu valor para o controle do mixer do MOC. Isso pode ser feito com um programa como este:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <alsa/asoundlib.h>

#define CHECK(fn) check((fn), #fn)
static void check(int err, const char *fn)
{
        if (err < 0) {
                fprintf(stderr, "%s failed: %s\n", fn, snd_strerror(err));
                exit(EXIT_FAILURE);
        }
}

int main()
{
        snd_ctl_t *ctl;
        snd_ctl_event_t *event;
        snd_ctl_elem_id_t *id_src, *id_dst;
        snd_ctl_elem_value_t *value;
        unsigned int mask;
        long raw, db;

        CHECK(snd_ctl_open(&ctl, "hw:0", 0));
        CHECK(snd_ctl_subscribe_events(ctl, 1));
        snd_ctl_event_alloca(&event);
        snd_ctl_elem_id_alloca(&id_src);
        snd_ctl_elem_id_alloca(&id_dst);
        snd_ctl_elem_value_alloca(&value);
        snd_ctl_elem_id_set_interface(id_dst, SND_CTL_ELEM_IFACE_MIXER);
        snd_ctl_elem_id_set_name(id_dst, "MOC Playback Volume");
        for (;;) {
                CHECK(snd_ctl_read(ctl, event));
                if (snd_ctl_event_get_type(event) != SND_CTL_EVENT_ELEM)
                        continue;
                mask = snd_ctl_event_elem_get_mask(event);
                if (mask == SND_CTL_EVENT_MASK_REMOVE ||
                    !(mask & SND_CTL_EVENT_MASK_VALUE) ||
                    strcmp(snd_ctl_event_elem_get_name(event),
                           "Some Mic Capture Volume"))
                        continue;
                snd_ctl_event_elem_get_id(event, id_src);
                snd_ctl_elem_value_set_id(value, id_src);
                CHECK(snd_ctl_elem_read(ctl, value));
                raw = snd_ctl_elem_value_get_integer(value, 0);
                CHECK(snd_ctl_convert_to_dB(ctl, id_src, raw, &db));
                CHECK(snd_ctl_convert_from_dB(ctl, id_dst, db, &raw, 0));
                snd_ctl_elem_value_set_id(value, id_dst);
                snd_ctl_elem_value_set_integer(value, 0, raw);
                snd_ctl_elem_value_set_integer(value, 1, raw);
                CHECK(snd_ctl_elem_write(ctl, value));
        }
}

(Use amixer controls para verificar os nomes dos controles reais.)

    
por CL. 12.11.2013 / 13:34