5

マシンで音量を dB 単位で設定できないようです。

VirtualBox(開発用)でUbuntu 13.04システムを実行しています。

これらの手順に従って、ボリュームをスカラーとして設定し、ミュート状態を制御しましたが、すべて正常に機能しました。

しかし、この関数でdBで設定しようとすると

snd_mixer_selem_set_playback_dB_all(エレム、ボリューム、0)

またはその機能で

snd_mixer_selem_set_playback_dB(elem, chn, volume, 0)

エラー コード-22 (無効な引数)で常に失敗します。

質問する前に: 私は既に広範囲のボリューム レベル (-20000 から 20000 まで) を設定しようとしましたが、最後のパラメーターを 3 つの定義済みの値 [-1, 0, 1] に変更しました。

今すぐテストするための私の完全なコードは次のとおりです。

#include <alsa/asoundlib.h>
#include <stdbool.h>
#include <stdlib.h>

void SetAlsaMasterVolume(long volume) {
    long min, max;
    snd_mixer_t *handle;
    snd_mixer_selem_id_t *sid;
    const char *card = "default";
    const char *selem_name = "Master";
    int x, mute_state;
    long i;
    
    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, volume * max / 100);

    snd_mixer_selem_get_playback_dB_range(elem, &min, &max);
    printf("min: %ld, max: %ld\n", min, max);

    snd_mixer_selem_channel_id_t chn;
    for (chn = 0; chn < 32; chn++) {
        for (i = -1000; i <= 1000; i++)
            if (x = snd_mixer_selem_set_playback_dB(elem, chn, i, 0)) {
                ;//printf("%d: %d %s\n", chn, x, snd_strerror(x));
            } else {
                printf("Volume successfully set in dB!\n");
            }
    }

    if (snd_mixer_selem_has_playback_switch(elem)) {
        snd_mixer_selem_set_playback_switch_all(elem, true);
        snd_mixer_selem_get_playback_switch(elem, 0, &mute_state);
        if (!mute_state) {
            printf("System Muted.\n");
        } else {
            printf("System unmuted.\n");
        }
    }

    snd_mixer_close(handle);
}

int main() {
    SetAlsaMasterVolume(100);
    return 0;
}

ご覧のとおり、この例ではすべてのチャンネルを自分で設定しようとしています。これは "snd_mixer_selem_set_playback_dB_all" が行うことと同じですが、異なる結果が得られるかどうかを確認するために試してみたかったのです。

この例の出力は次のようになります。

最小: 15774463、最大: 191

システムのミュートが解除されました。

dB 値の範囲を広げる前に、テストした出力は次のとおりでした。

最小: 1、最大: 191

多分私はここで何かを逃しています.私はあなたが私を助けてくれることを願っています!

編集:

このスクリプトをコンパイルするには、次のコマンドを使用します。

gcc test.c -lasound -o テスト

4

1 に答える 1