如何使用 C# 使用 ALSA 在 Linux 中获取和设置音量?
Posted
技术标签:
【中文标题】如何使用 C# 使用 ALSA 在 Linux 中获取和设置音量?【英文标题】:How to get and set volume in Linux using ALSA using C#? 【发布时间】:2020-01-15 01:06:35 【问题描述】:我想使用 C# 代码获取 Linux 的系统卷。如何做到这一点?
额外信息:
-->有没有我可以使用的库/dll。
-->我遇到过alsa-sharp,但没有找到任何关于音量的功能。
--> 我遇到过 C 代码,但我不熟悉如何在 C# 中使用它。
【问题讨论】:
你检查过 ALSA 相关的 .net 包装器吗?谷歌搜索给了我this one,声称支持 ALSA 作为后端。 是的,我已经检查过了。但他们没有任何我可以使用的音量功能。例如,在 Alsa-Sharp 和 Soundiosharp 中,它们都导入了一些“SETVOLUME”函数。但我在各自的源代码中没有看到任何 C# 实现。因此我无法使用它们 尚未测试或下载 API,但该 API 似乎具有返回音量 github search on SoundIOSharp 的属性 我也不确定如何使用它,SoundIOOutStream 的构造函数需要一个我不确定如何使用的参数。 内部 SoundIOOutStream(指针迟到总比没有好,但我在设置基于 RPi 的互联网广播时遇到了这个问题,下面的代码(您也可以找到 at this git)对我有用。
它基于 this answer 和 https://github.com/atsushieno 的 native interop code from alsa-sharp。
注意:您可能需要尝试使用“card”和“selemName”参数。
using System;
using System.Runtime.InteropServices;
namespace Alsa
public sealed class VolumeControl : IDisposable
private readonly long _min;
private readonly long _max;
private readonly IntPtr _sid;
private readonly IntPtr _selem;
private readonly IntPtr _handle;
private const string LibraryName = "libasound";
public VolumeControl(string card = "default", string selemName = "PCM")
snd_mixer_open(ref _handle, 0);
snd_mixer_attach(_handle, card);
snd_mixer_selem_register(_handle, default, default);
snd_mixer_load(_handle);
snd_mixer_selem_id_malloc(ref _sid);
snd_mixer_selem_id_set_index(_sid, 0);
snd_mixer_selem_id_set_name(_sid, selemName);
_selem = snd_mixer_find_selem(_handle, _sid);
snd_mixer_selem_get_playback_volume_range(_selem, ref _min, ref _max);
public void SetVolumePercent(int volume)
snd_mixer_selem_set_playback_volume_all(_selem, (int)(volume * _max / 100));
public void Dispose()
ReleaseUnmanagedResources();
GC.SuppressFinalize(this);
private void ReleaseUnmanagedResources()
snd_mixer_selem_id_free(_sid);
snd_mixer_close(_handle);
~AlsaSoundOutput()
ReleaseUnmanagedResources();
[DllImport(LibraryName)]
internal static extern int snd_mixer_open(ref IntPtr mixer, int mode);
[DllImport(LibraryName, CharSet = CharSet.Ansi)]
internal static extern int snd_mixer_attach(IntPtr mixer, [MarshalAs(UnmanagedType.LPStr)] string name);
[DllImport(LibraryName)]
internal static extern int snd_mixer_selem_register(IntPtr mixer, IntPtr options, IntPtr classp);
[DllImport(LibraryName)]
internal static extern int snd_mixer_load(IntPtr mixer);
[DllImport(LibraryName)]
internal static extern int snd_mixer_selem_id_malloc(ref IntPtr selem);
[DllImport(LibraryName)]
internal static extern void snd_mixer_selem_id_set_index(IntPtr selem, uint val);
[DllImport(LibraryName, CharSet = CharSet.Ansi)]
internal static extern void snd_mixer_selem_id_set_name(IntPtr selem, [MarshalAs(UnmanagedType.LPStr)] string value);
[DllImport(LibraryName)]
internal static extern IntPtr snd_mixer_find_selem(IntPtr mixer, IntPtr selem);
[DllImport(LibraryName)]
internal static extern int snd_mixer_selem_get_playback_volume_range(IntPtr selem, ref long min, ref long max);
[DllImport(LibraryName)]
internal static extern int snd_mixer_selem_set_playback_volume_all(IntPtr selem, int value);
[DllImport(LibraryName)]
internal static extern void snd_mixer_selem_id_free(IntPtr selem);
[DllImport(LibraryName)]
internal static extern int snd_mixer_close(IntPtr mixer);
【讨论】:
以上是关于如何使用 C# 使用 ALSA 在 Linux 中获取和设置音量?的主要内容,如果未能解决你的问题,请参考以下文章
使用 pyaudio 在 linux/ubuntu 上运行烧瓶应用程序时出现 ALSA 错误
在 C 中使用 ALSA 以不同的音量播放多个 wav 文件