Search code examples
pythonmultiprocessingpydubsimpleaudioengine

SimpleaudioError: Error opening PCM device. -- CODE: -5 -- MSG: Input/output error


When I run play_audio() it works without any problem and I can hear the audio playing.

from multiprocessing import Process
from pydub import AudioSegment
from pydub.playback import play

name = "audio.wav"

def play_audio():
    wavf= AudioSegment.from_wav(name)
    play(wavf)

if __name__ == "__main__":

    print("Test without process")
    play_audio()

    print("Test with process")
    s_task=Process(target=play_audio)
    s_task.start()
    print("starting")
    s_task.join()

But running the function in a process gives an error, here is the output:

Test without process
Test with process
starting
Process Process-1:
Traceback (most recent call last):
  File "/usr/lib/python3.8/multiprocessing/process.py", line 315, in _bootstrap
    self.run()
  File "/usr/lib/python3.8/multiprocessing/process.py", line 108, in run
    self._target(*self._args, **self._kwargs)
  File "/home/marvin/git/mmi/src/yumi/yumi_motion_api/scripts/stackoverflow.py", line 9, in play_audio
    play(wavf)
  File "/home/marvin/.local/lib/python3.8/site-packages/pydub/playback.py", line 53, in play
    playback = _play_with_simpleaudio(audio_segment)
  File "/home/marvin/.local/lib/python3.8/site-packages/pydub/playback.py", line 43, in _play_with_simpleaudio
    return simpleaudio.play_buffer(
  File "/home/marvin/.local/lib/python3.8/site-packages/simpleaudio/shiny.py", line 60, in play_buffer
    play_id = _sa._play_buffer(audio_data, num_channels, bytes_per_sample,
_simpleaudio.SimpleaudioError: Error opening PCM device. -- CODE: -5 -- MSG: Input/output error

This link contains the .wav file that I am using.


Solution

  • Replacing

    from multiprocessing import Process
    s_task=Process(target=play_audio)
    

    with

    from threading import Thread
    s_task=Thread(target=play_audio)
    

    works just fine