. net core Linux Сервис - Отказ в соединении Pulseaudio - PullRequest
0 голосов
/ 03 мая 2020

Я создал приложение. net core 3.1, которое использует pulseaudio в Ubuntu. Это работает отлично, когда я запускаю его непосредственно в консоле с помощью:

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.

Код, пропущенный при доступе к Pulseaudio через OpenTK / OpenAL:

    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:");


...