Skip to content

Commit

Permalink
Rearrange player cleanup code
Browse files Browse the repository at this point in the history
Since apparently closing stdin and later calling communicate() is no bueno, 
we're just going to rearrange the process finalization code so both cleanup()
and the pipe loop exit conditions point to it.
  • Loading branch information
imayhaveborkedit authored Aug 27, 2021
1 parent b12fe22 commit 12dcc7c
Showing 1 changed file with 21 additions and 18 deletions.
39 changes: 21 additions & 18 deletions discord/player.py
Original file line number Diff line number Diff line change
Expand Up @@ -155,7 +155,7 @@ def __init__(self, source: Union[str, io.BufferedIOBase], *, executable: str = '
self._pipe_thread: Optional[threading.Thread] = None

if piping:
n = f'PopenStdinWriter:{id(self):#x}'
n = f'popen-stdin-writer:{id(self):#x}'
self._stdin = self._process.stdin
self._pipe_thread = threading.Thread(target=self._pipe_writer, args=(source,), daemon=True, name=n)
self._pipe_thread.start()
Expand All @@ -172,22 +172,7 @@ def _spawn_process(self, args: Any, **subprocess_kwargs: Any) -> subprocess.Pope
else:
return process

def _pipe_writer(self, source: io.BufferedIOBase) -> None:
while self._process:
# arbitrarily large read size
data = source.read(8192)
if not data:
self._stdin.close() # EOF
break
try:
self._stdin.write(data)
except Exception:
_log.debug('Write error for %s, this is probably not a problem', self, exc_info=True)
# at this point the source data is either exhausted or the process is fubar
self._stdin.close()
break

def cleanup(self) -> None:
def _kill_process(self) -> None:
proc = self._process
if proc is MISSING:
return
Expand All @@ -206,7 +191,25 @@ def cleanup(self) -> None:
else:
_log.info('ffmpeg process %s successfully terminated with return code of %s.', proc.pid, proc.returncode)

self._process = self._stdout = MISSING

def _pipe_writer(self, source: io.BufferedIOBase) -> None:
while self._process:
# arbitrarily large read size
data = source.read(8192)
if not data:
self._process.terminate()
return
try:
self._stdin.write(data)
except Exception:
_log.debug('Write error for %s, this is probably not a problem', self, exc_info=True)
# at this point the source data is either exhausted or the process is fubar
self._process.terminate()
return

def cleanup(self) -> None:
self._kill_process()
self._process = self._stdout = self._stdin = MISSING

class FFmpegPCMAudio(FFmpegAudio):
"""An audio source from FFmpeg (or AVConv).
Expand Down

0 comments on commit 12dcc7c

Please sign in to comment.