Mercurial > octave-nkf
comparison libinterp/dldfcn/audiodevinfo.cc @ 19708:b3363c531662
Stop audioplayer and audiorecorder when done or interrupted
* audiodevinfo.cc (audioplayer::playblocking, audiorecorder::recordblocking):
Use unwind_protect to stop stream.
author | Mike Miller <mtmiller@ieee.org> |
---|---|
date | Sat, 07 Feb 2015 19:38:44 -0500 |
parents | cdf9c83b0e79 |
children | 4197fc428c7d |
comparison
equal
deleted
inserted
replaced
19707:cdf9c83b0e79 | 19708:b3363c531662 |
---|---|
39 #include "oct-obj.h" | 39 #include "oct-obj.h" |
40 #include "ov.h" | 40 #include "ov.h" |
41 #include "ov-int32.h" | 41 #include "ov-int32.h" |
42 #include "ov-struct.h" | 42 #include "ov-struct.h" |
43 #include "parse.h" | 43 #include "parse.h" |
44 #include "unwind-prot.h" | |
44 | 45 |
45 #if defined (HAVE_PORTAUDIO) | 46 #if defined (HAVE_PORTAUDIO) |
46 | 47 |
47 #include <portaudio.h> | 48 #include <portaudio.h> |
48 | 49 |
844 } | 845 } |
845 | 846 |
846 return paContinue; | 847 return paContinue; |
847 } | 848 } |
848 | 849 |
850 static void | |
851 safe_audioplayer_stop (audioplayer *player) | |
852 { | |
853 player->stop (); | |
854 } | |
855 | |
849 audioplayer::audioplayer (void) | 856 audioplayer::audioplayer (void) |
850 : octave_callback_function (0), | 857 : octave_callback_function (0), |
851 id (-1), fs (0), nbits (16), channels (0), sample_number (0), | 858 id (-1), fs (0), nbits (16), channels (0), sample_number (0), |
852 end_sample (-1), tag (""), y (), userdata (Matrix ()), | 859 end_sample (-1), tag (""), y (), userdata (Matrix ()), |
853 left (), right (), stream (0), output_parameters (), type () | 860 left (), right (), stream (0), output_parameters (), type () |
1149 | 1156 |
1150 unsigned int start, end; | 1157 unsigned int start, end; |
1151 start = get_sample_number (); | 1158 start = get_sample_number (); |
1152 end = get_end_sample (); | 1159 end = get_end_sample (); |
1153 | 1160 |
1161 unwind_protect frame; | |
1162 | |
1163 frame.add_fcn (safe_audioplayer_stop, this); | |
1164 | |
1154 for (unsigned int i = start; i < end; i += buffer_size) | 1165 for (unsigned int i = start; i < end; i += buffer_size) |
1155 { | 1166 { |
1156 OCTAVE_QUIT; | 1167 OCTAVE_QUIT; |
1157 if (octave_callback_function != 0) | 1168 if (octave_callback_function != 0) |
1158 octave_play_callback (0, buffer, buffer_size, 0, 0, this); | 1169 octave_play_callback (0, buffer, buffer_size, 0, 0, this); |
1159 else | 1170 else |
1160 portaudio_play_callback (0, buffer, buffer_size, 0, 0, this); | 1171 portaudio_play_callback (0, buffer, buffer_size, 0, 0, this); |
1161 | 1172 |
1162 err = Pa_WriteStream (stream, buffer, buffer_size); | 1173 err = Pa_WriteStream (stream, buffer, buffer_size); |
1163 } | 1174 } |
1164 | |
1165 err = Pa_StopStream (stream); | |
1166 if (err != paNoError) | |
1167 { | |
1168 error ("audioplayer: failed to stop audio playback stream"); | |
1169 return; | |
1170 } | |
1171 | |
1172 err = Pa_CloseStream (stream); | |
1173 if (err != paNoError) | |
1174 { | |
1175 error ("audioplayer: failed to close audio playback stream"); | |
1176 return; | |
1177 } | |
1178 | |
1179 stream = 0; | |
1180 set_sample_number (0); | |
1181 reset_end_sample (); | |
1182 } | 1175 } |
1183 | 1176 |
1184 void | 1177 void |
1185 audioplayer::play (void) | 1178 audioplayer::play (void) |
1186 { | 1179 { |
1532 return paComplete; | 1525 return paComplete; |
1533 | 1526 |
1534 return paContinue; | 1527 return paContinue; |
1535 } | 1528 } |
1536 | 1529 |
1530 static void | |
1531 safe_audiorecorder_stop (audiorecorder *recorder) | |
1532 { | |
1533 recorder->stop (); | |
1534 } | |
1535 | |
1537 audiorecorder::audiorecorder (void) | 1536 audiorecorder::audiorecorder (void) |
1538 : octave_callback_function (0), | 1537 : octave_callback_function (0), |
1539 id (-1), fs (44100), nbits (16), channels (2), sample_number (0), | 1538 id (-1), fs (44100), nbits (16), channels (2), sample_number (0), |
1540 end_sample (-1), tag (""), y (), userdata (Matrix ()), | 1539 end_sample (-1), tag (""), y (), userdata (Matrix ()), |
1541 left (), right (), stream (0), input_parameters (), type () | 1540 left (), right (), stream (0), input_parameters (), type () |
1824 return; | 1823 return; |
1825 } | 1824 } |
1826 | 1825 |
1827 unsigned int frames = seconds * get_fs (); | 1826 unsigned int frames = seconds * get_fs (); |
1828 | 1827 |
1828 unwind_protect frame; | |
1829 | |
1830 frame.add_fcn (safe_audiorecorder_stop, this); | |
1831 | |
1829 for (unsigned int i = 0; i < frames; i += buffer_size) | 1832 for (unsigned int i = 0; i < frames; i += buffer_size) |
1830 { | 1833 { |
1831 OCTAVE_QUIT; | 1834 OCTAVE_QUIT; |
1832 Pa_ReadStream (get_stream (), buffer, buffer_size); | 1835 Pa_ReadStream (get_stream (), buffer, buffer_size); |
1833 | 1836 |