c# - 如何使用 C# 使用 ALSA 在 Linux 中获取和设置音量?
问题描述
我想使用 C# 代码获取 Linux 的系统卷。这个怎么做?
额外信息:
--> 有没有我可以使用的库/dll。
-->我遇到过alsa-sharp,但我没有找到任何关于音量的功能。
--> 我遇到过 C 代码,但我不熟悉如何在 C# 中使用它。
解决方案
迟到总比没有好,但我在设置基于 RPi 的互联网广播时遇到了这个问题,您也可以在这个 git上找到以下代码,它对我有用。
它基于这个答案和来自https://github.com/atsushieno的 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);
}
}
推荐阅读
- java - 从 SQL 创建 ElasticSearch 6.5 嵌套布尔查询
- android - 改造 POST 请求永远不会返回到 OnResponse
- wordpress - Wordpress 中的乳胶表示法
- r - R Caret createFolds 不均匀
- angular - ngxs 异步操作的成功/失败操作事件的目的是什么?
- wpf - 折叠时其他人未使用WPF用户控件空间
- javascript - window.open() 跟踪用户输入
- windows - 如何在命令提示符下将整个输出发送到日志文件以显示时间更改和错误
- django - Django:从管理员的静态文件夹中渲染图像
- batch-file - 使用 sed 和 bc 在文本文件中计算