Skip to content

Commit

Permalink
Added some error recovery code to library
Browse files Browse the repository at this point in the history
  • Loading branch information
wedesoft committed Oct 21, 2010
1 parent 301f509 commit 1db08ce
Show file tree
Hide file tree
Showing 2 changed files with 25 additions and 12 deletions.
2 changes: 1 addition & 1 deletion Rakefile
Original file line number Original file line Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ require 'rake/loaders/makefile'
require 'rbconfig' require 'rbconfig'


PKG_NAME = 'hornetseye-alsa' PKG_NAME = 'hornetseye-alsa'
PKG_VERSION = '0.1.1' PKG_VERSION = '0.1.2'
CXX = ENV[ 'CXX' ] || 'g++' CXX = ENV[ 'CXX' ] || 'g++'
STRIP = ENV[ 'STRIP' ] || 'strip' STRIP = ENV[ 'STRIP' ] || 'strip'
RB_FILES = FileList[ 'lib/**/*.rb' ] RB_FILES = FileList[ 'lib/**/*.rb' ]
Expand Down
35 changes: 24 additions & 11 deletions ext/alsaoutput.cc
Original file line number Original file line Diff line number Diff line change
Expand Up @@ -83,10 +83,16 @@ void AlsaOutput::write( SequencePtr frame ) throw (Error)
{ {
ERRORMACRO( m_pcmHandle != NULL, Error, , "PCM device \"" << m_pcmName ERRORMACRO( m_pcmHandle != NULL, Error, , "PCM device \"" << m_pcmName
<< "\" is not open. Did you call \"close\" before?" ); << "\" is not open. Did you call \"close\" before?" );
int err = snd_pcm_writei( m_pcmHandle, (short int *)frame->data(), int n = frame->size() / ( 2 * m_channels );
frame->size() / ( 2 * m_channels ) ); int err;
ERRORMACRO( err >= 0, Error, , "Error writing audio frames to PCM device \"" while ( ( err = snd_pcm_writei( m_pcmHandle, (short int *)frame->data(),
<< m_pcmName << "\": " << snd_strerror( err ) ); n ) ) < 0 ) {
err = snd_pcm_recover( m_pcmHandle, err, 1 );
ERRORMACRO( err >= 0, Error, , "Error writing audio frames to PCM device \""
<< m_pcmName << "\": " << snd_strerror( err ) );
};
ERRORMACRO( n == err, Error, , "Only managed to write " << err << " of " << n
<< " frames to PCM device \"" << m_pcmName << "\"" );
} }


void AlsaOutput::drop(void) throw (Error) void AlsaOutput::drop(void) throw (Error)
Expand Down Expand Up @@ -122,10 +128,14 @@ int AlsaOutput::avail(void) throw (Error)
{ {
ERRORMACRO( m_pcmHandle != NULL, Error, , "PCM device \"" << m_pcmName ERRORMACRO( m_pcmHandle != NULL, Error, , "PCM device \"" << m_pcmName
<< "\" is not open. Did you call \"close\" before?" ); << "\" is not open. Did you call \"close\" before?" );
snd_pcm_sframes_t frames = snd_pcm_avail( m_pcmHandle ); snd_pcm_sframes_t frames;
ERRORMACRO( frames >= 0, Error, , "Error querying number of available frames for " int err = 0;
while ( ( frames = snd_pcm_avail( m_pcmHandle ) ) < 0 ) {
err = snd_pcm_recover( m_pcmHandle, frames, 1 );
ERRORMACRO( err >= 0, Error, , "Error querying number of available frames for "
"update of PCM device \"" << m_pcmName << "\": " "update of PCM device \"" << m_pcmName << "\": "
<< snd_strerror( frames ) ); << snd_strerror( err ) );
};
return frames; return frames;
} }


Expand All @@ -134,10 +144,13 @@ int AlsaOutput::delay(void) throw (Error)
ERRORMACRO( m_pcmHandle != NULL, Error, , "PCM device \"" << m_pcmName ERRORMACRO( m_pcmHandle != NULL, Error, , "PCM device \"" << m_pcmName
<< "\" is not open. Did you call \"close\" before?" ); << "\" is not open. Did you call \"close\" before?" );
snd_pcm_sframes_t frames; snd_pcm_sframes_t frames;
int err = snd_pcm_delay( m_pcmHandle, &frames ); int err;
ERRORMACRO( err >= 0, Error, , "Error querying number of available frames for " while ( ( err = snd_pcm_delay( m_pcmHandle, &frames ) ) < 0 ) {
"update of PCM device \"" << m_pcmName << "\": " err = snd_pcm_recover( m_pcmHandle, err, 1 );
<< snd_strerror( err ) ); ERRORMACRO( err >= 0, Error, , "Error querying number of available frames for "
"update of PCM device \"" << m_pcmName << "\": "
<< snd_strerror( err ) );
};
return frames; return frames;
} }


Expand Down

0 comments on commit 1db08ce

Please sign in to comment.