我创建了一个.net core 3.1应用程序,该应用程序在ubuntu上使用pulseaudio。 当我直接在consle中启动它时,这是完美的工作:
dotnet /home/ubuntu/LedGrpcService/LedGrpcService.dll
但是当我将其作为linux服务运行时,出现以下错误:
ALSA lib pulse.c:242:(pulse_connect) PulseAudio: Unable to connect: Connection refused
这是我的服务配置:
[Unit]
Description=Ambient Light LED in .NET
# Requires=xyz.service
# After=xyz.service
[Service]
Type=simple
WorkingDirectory=/home/ubuntu/LedGrpcService
ExecStart=/usr/share/dotnet-sdk/dotnet home/ubuntu/LedGrpcService/LedGrpcService.dll
User=ubuntu
[Install]
WantedBy=multi-user.target
我想这是一个权限问题。但我不确定。
.net核心代码使用OpenTK记录音频。
作为常规应用程序启动时,代码可以完美运行。但不适用于服务。 该服务在我的常规非root用户下运行。
在通过OpenTK / OpenAL访问Pulseaudio的地方,代码被截断:
using OpenTK;
using OpenTK.Audio;
using OpenTK.Audio.OpenAL;
.
.
.
try
{
audio_context = new AudioContext();
}
catch (AudioException ae)
{
Console.WriteLine("Fatal: Cannot continue without a playback device.\nException caught when opening playback device.\n" + ae.Message);
return 1;
}
AL.Listener(ALListenerf.Gain, (float)1.0);
src = AL.GenSource();
double buffer_length_ms = 10; //10 ms buffer recordings //(double)numericUpDown_BufferLength.Value;
int buffer_length_samples = (int)((double)buffer_length_ms * samplingRate * 0.001 / BlittableValueType.StrideOf(buffer));
var devices = AudioCapture.AvailableDevices;
Console.WriteLine("Available Devices:");
for (int i = 0; i < devices.Count; i++)
{
Console.WriteLine("Device #{0}: {1}", i, devices[i]);
}
//Console.WriteLine("Select device number:");