.net核心Linux服务-Pulseaudio连接被拒绝

时间:2020-05-03 15:09:21

标签: linux .net-core pulseaudio

我创建了一个.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:");


0 个答案:

没有答案