applied patch sent by Pierre Souchay <pierre@souchay.net>, closes #30

This commit is contained in:
darkeye 2007-11-20 13:59:03 +00:00
parent dc5aaa9faf
commit 5cd6f2703a
2 changed files with 42 additions and 19 deletions

View File

@ -2,6 +2,8 @@ Darkice 0.19 to be released
o added mount point option for Darwin Streaming Server o added mount point option for Darwin Streaming Server
thanks to Pierre Souchay <pierre@souchay.net> thanks to Pierre Souchay <pierre@souchay.net>
o fix for some reliablity issues when using a Jack source
thanks to Pierre Souchay <pierre@souchay.net>
26-04-2007 DarkIce 0.18.1 released 26-04-2007 DarkIce 0.18.1 released

View File

@ -277,26 +277,39 @@ bool
JackDspSource :: canRead ( unsigned int sec, JackDspSource :: canRead ( unsigned int sec,
unsigned int usec ) throw ( Exception ) unsigned int usec ) throw ( Exception )
{ {
size_t available=0; const unsigned int max_wait_time = sec * 1000000;
const unsigned int wait_increment = 10000;
unsigned int cur_wait = 0;
if ( !isOpen() ) { if ( !isOpen() ) {
return false; return false;
} }
// How many bytes available in ring buffer ? while (max_wait_time > cur_wait) {
available = jack_ringbuffer_read_space( rb[0] ); bool canRead = true;
if (available) return true;
for (unsigned int c = 0 ; c < getChannel() ; c++) {
// Sleep and check again if (jack_ringbuffer_read_space(rb[c]) <= 0) {
// FIXME: should we really sleep the full duration ? canRead = false;
usleep( (sec*1000000) + usec ); }
}
available = jack_ringbuffer_read_space( rb[0] );
if (available) { if (canRead) {
return true; return true;
} else { }
return false;
cur_wait += wait_increment;
usleep ( wait_increment );
} }
usleep( usec );
for (unsigned int c = 0 ; c < getChannel() ; c++) {
if (jack_ringbuffer_read_space(rb[c]) <= 0) {
return false;
}
}
return true;
} }
@ -324,14 +337,22 @@ JackDspSource :: read ( void * buf,
throw Exception( __FILE__, __LINE__, "realloc on tmp_buffer failed"); throw Exception( __FILE__, __LINE__, "realloc on tmp_buffer failed");
} }
// We must be sure to fetch as many data on both channels
int minBytesAvailable = samples * sizeof( jack_default_audio_sample_t );
for (c=0; c<getChannel(); c++) for (c=0; c<getChannel(); c++) {
{ int readable = jack_ringbuffer_read_space(rb[1]);
if (readable < minBytesAvailable) {
minBytesAvailable = readable;
}
}
for (c=0; c<getChannel(); c++) {
// Copy frames from ring buffer to temporary buffer // Copy frames from ring buffer to temporary buffer
// and then convert samples to output buffer // and then convert samples to output buffer
int bytes_read = jack_ringbuffer_read(rb[c], int bytes_read = jack_ringbuffer_read(rb[c],
(char*)tmp_buffer, (char*)tmp_buffer,
samples * sizeof( jack_default_audio_sample_t )); minBytesAvailable);
samples_read[c] = bytes_read / sizeof( jack_default_audio_sample_t ); samples_read[c] = bytes_read / sizeof( jack_default_audio_sample_t );