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