If para_audiod is terminated by a signal it calls the ->close() method
of each active writer. In this method the ao writer calls ao_close()
and frees all resources but leaves the play thread active. So the
thread continues to run, prints
ao_alsa ERROR: write error: File descriptor in bad state
and probably crashes afterwards due to accessing freed memory. Fix this
by cancelling the thread in ->close() if it exists. Ironically enough,
this re-introduces a call to pthread_join(), but it's OK here since
we the cancelled thread should exit immediately (so we don't block),
and we are about to exit anyway.
if (!pawd)
return;
+ if (pawd->thread_btrn) {
+ pthread_cancel(pawd->thread);
+ pthread_join(pawd->thread, NULL);
+ }
ao_close(pawd->dev);
free(pawd);
wn->private_data = NULL;