+ unique_lock<mutex> input_lock(_input_mutex);
+ while(!boost::this_thread::interruption_requested() &&
+ !_frame_complete && _samples_decoded >= _sample_count)
+ _input_cond.wait(input_lock);
+ return boost::make_optional(
+ !boost::this_thread::interruption_requested() &&
+ (_samples_decoded < _sample_count || !_frame_complete),
+ _sample_count);
+}
+
+void DecoderStack::decode_data(
+ const int64_t sample_count, const unsigned int unit_size,
+ srd_session *const session)
+{
+ uint8_t chunk[DecodeChunkLength];
+
+ const unsigned int chunk_sample_count =
+ DecodeChunkLength / _snapshot->unit_size();
+
+ for (int64_t i = 0;
+ !boost::this_thread::interruption_requested() &&
+ i < sample_count;
+ i += chunk_sample_count)
+ {
+ lock_guard<mutex> decode_lock(_global_decode_mutex);
+
+ const int64_t chunk_end = min(
+ i + chunk_sample_count, sample_count);
+ _snapshot->get_samples(chunk, i, chunk_end);
+
+ if (srd_session_send(session, i, i + sample_count, chunk,
+ (chunk_end - i) * unit_size) != SRD_OK) {
+ _error_message = tr("Decoder reported an error");
+ break;
+ }
+
+ {
+ lock_guard<mutex> lock(_output_mutex);
+ _samples_decoded = chunk_end;
+ }
+ }
+