hornetseye-alsa 1.1.0 → 1.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (4) hide show
  1. data/Rakefile +1 -1
  2. data/ext/alsaoutput.cc +26 -4
  3. data/ext/alsaoutput.hh +2 -0
  4. metadata +3 -3
data/Rakefile CHANGED
@@ -7,7 +7,7 @@ require 'rake/loaders/makefile'
7
7
  require 'rbconfig'
8
8
 
9
9
  PKG_NAME = 'hornetseye-alsa'
10
- PKG_VERSION = '1.1.0'
10
+ PKG_VERSION = '1.1.1'
11
11
  CFG = RbConfig::CONFIG
12
12
  CXX = ENV[ 'CXX' ] || 'g++'
13
13
  RB_FILES = FileList[ 'lib/**/*.rb' ]
data/ext/alsaoutput.cc CHANGED
@@ -92,7 +92,7 @@ void AlsaOutput::write(SequencePtr frame) throw (Error)
92
92
  int n = frame->size() / (2 * m_channels);
93
93
  lock();
94
94
  if (!m_data.get()) {
95
- if (m_threadInitialised) pthread_detach(m_thread);
95
+ if (m_threadInitialised) pthread_join(m_thread, NULL);
96
96
  while(m_size < n) m_size = 2 * m_size;
97
97
  m_data = boost::shared_array<short int>(new short int[m_size * m_channels]);
98
98
  m_start = 0;
@@ -145,6 +145,17 @@ void AlsaOutput::drain(void) throw (Error)
145
145
  snd_pcm_drain(m_pcmHandle);
146
146
  }
147
147
 
148
+ void AlsaOutput::prepare(void) throw (Error)
149
+ {
150
+ ERRORMACRO( m_pcmHandle != NULL, Error, , "PCM device \"" << m_pcmName
151
+ << "\" is not open. Did you call \"close\" before?" );
152
+
153
+ int err = snd_pcm_prepare( m_pcmHandle );
154
+ ERRORMACRO( err >= 0, Error, , "Error preparing PCM device \"" << m_pcmName
155
+ << "\": " << snd_strerror( err ) );
156
+ // pthread_mutex_lock( &m_mutex );
157
+ }
158
+
148
159
  unsigned int AlsaOutput::rate(void)
149
160
  {
150
161
  return m_rate;
@@ -215,6 +226,7 @@ void AlsaOutput::threadFunc(void)
215
226
  {
216
227
  bool quit = false;
217
228
  while (!quit) {
229
+ snd_pcm_wait(m_pcmHandle, 1000);
218
230
  try {
219
231
  lock();
220
232
  int n = m_periodSize;
@@ -225,15 +237,13 @@ void AlsaOutput::threadFunc(void)
225
237
  if (m_start + n > m_size) {
226
238
  writei(m_data.get() + m_start * m_channels, m_size - m_start);
227
239
  writei(m_data.get(), m_start + n - m_size);
228
- } else {
240
+ } else
229
241
  writei(m_data.get() + m_start * m_channels, n);
230
- };
231
242
  m_start += n;
232
243
  m_count -= n;
233
244
  } else
234
245
  quit = true;
235
246
  unlock();
236
- snd_pcm_wait(m_pcmHandle, 1000);
237
247
  } catch (Error &e) {
238
248
  quit = true;
239
249
  unlock();
@@ -255,6 +265,7 @@ VALUE AlsaOutput::registerRubyClass( VALUE rbModule )
255
265
  rb_define_method( cRubyClass, "write", RUBY_METHOD_FUNC( wrapWrite ), 1 );
256
266
  rb_define_method( cRubyClass, "drop", RUBY_METHOD_FUNC( wrapDrop ), 0 );
257
267
  rb_define_method( cRubyClass, "drain", RUBY_METHOD_FUNC( wrapDrain ), 0 );
268
+ rb_define_method( cRubyClass, "prepare", RUBY_METHOD_FUNC( wrapPrepare ), 0 );
258
269
  rb_define_method( cRubyClass, "rate", RUBY_METHOD_FUNC( wrapRate ), 0 );
259
270
  rb_define_method( cRubyClass, "channels", RUBY_METHOD_FUNC( wrapChannels ), 0 );
260
271
  rb_define_method( cRubyClass, "delay", RUBY_METHOD_FUNC( wrapDelay ), 0 );
@@ -321,6 +332,17 @@ VALUE AlsaOutput::wrapDrain( VALUE rbSelf )
321
332
  return rbSelf;
322
333
  }
323
334
 
335
+ VALUE AlsaOutput::wrapPrepare( VALUE rbSelf )
336
+ {
337
+ try {
338
+ AlsaOutputPtr *self; Data_Get_Struct( rbSelf, AlsaOutputPtr, self );
339
+ (*self)->prepare();
340
+ } catch ( exception &e ) {
341
+ rb_raise( rb_eRuntimeError, "%s", e.what() );
342
+ };
343
+ return rbSelf;
344
+ }
345
+
324
346
  VALUE AlsaOutput::wrapRate( VALUE rbSelf )
325
347
  {
326
348
  AlsaOutputPtr *self; Data_Get_Struct( rbSelf, AlsaOutputPtr, self );
data/ext/alsaoutput.hh CHANGED
@@ -32,6 +32,7 @@ public:
32
32
  void write( SequencePtr sequence ) throw (Error);
33
33
  void drop(void) throw (Error);
34
34
  void drain(void) throw (Error);
35
+ void prepare(void) throw (Error);
35
36
  unsigned int rate(void);
36
37
  unsigned int channels(void);
37
38
  int delay(void) throw (Error);
@@ -46,6 +47,7 @@ public:
46
47
  static VALUE wrapWrite( VALUE rbSelf, VALUE rbSequence );
47
48
  static VALUE wrapDrop( VALUE rbSelf );
48
49
  static VALUE wrapDrain( VALUE rbSelf );
50
+ static VALUE wrapPrepare( VALUE rbSelf );
49
51
  static VALUE wrapRate( VALUE rbSelf );
50
52
  static VALUE wrapChannels( VALUE rbSelf );
51
53
  static VALUE wrapDelay( VALUE rbSelf );
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: hornetseye-alsa
3
3
  version: !ruby/object:Gem::Version
4
- hash: 19
4
+ hash: 17
5
5
  prerelease:
6
6
  segments:
7
7
  - 1
8
8
  - 1
9
- - 0
10
- version: 1.1.0
9
+ - 1
10
+ version: 1.1.1
11
11
  platform: ruby
12
12
  authors:
13
13
  - Jan Wedekind