Skip to content

Commit d073522

Browse files
committed
remove BufferedPrefixStream
1 parent cfa4810 commit d073522

File tree

3 files changed

+21
-138
lines changed

3 files changed

+21
-138
lines changed

src/AudioTools/AudioCodecs/StreamingDecoder.h

Lines changed: 4 additions & 138 deletions
Original file line numberDiff line numberDiff line change
@@ -670,135 +670,6 @@ class MultiStreamingDecoder : public StreamingDecoder {
670670
void setMimeSource(MimeSource& mimeSource) { p_mime_source = &mimeSource; }
671671

672672
protected:
673-
/**
674-
* @brief Simple buffered stream that prefixes buffered data before reading
675-
* from the main stream
676-
*
677-
* This internal helper class creates a virtual stream that first serves data
678-
* from a buffer (used for format detection), then seamlessly continues
679-
* reading from the main input stream. This ensures that data used for MIME
680-
* detection is not lost and is available to the selected decoder.
681-
*/
682-
class BufferedPrefixStream : public Stream {
683-
public:
684-
/**
685-
* @brief Sets the main stream to read from after buffer is exhausted
686-
*
687-
* @param stream The main input stream
688-
*/
689-
void setStream(Stream& stream) { p_stream = &stream; }
690-
691-
/**
692-
* @brief Sets the buffer data to serve first
693-
*
694-
* @param data Pointer to buffer data
695-
* @param len Length of buffer data
696-
*/
697-
void setBuffer(uint8_t* data, size_t len) {
698-
buffer_data = data;
699-
buffer_size = len;
700-
buffer_pos = 0;
701-
has_buffer = true;
702-
}
703-
704-
/**
705-
* @brief Returns number of bytes available for reading
706-
*
707-
* @return Total bytes available from buffer and main stream
708-
*/
709-
int available() override {
710-
int result = 0;
711-
if (has_buffer && buffer_pos < buffer_size) {
712-
result += buffer_size - buffer_pos;
713-
}
714-
if (p_stream != nullptr) {
715-
result += p_stream->available();
716-
}
717-
return result;
718-
}
719-
720-
/**
721-
* @brief Reads a single byte
722-
*
723-
* Reads from buffer first, then from main stream when buffer is exhausted.
724-
*
725-
* @return Byte value or -1 if no data available
726-
*/
727-
int read() override {
728-
if (has_buffer && buffer_pos < buffer_size) {
729-
return buffer_data[buffer_pos++];
730-
}
731-
if (p_stream != nullptr) {
732-
return p_stream->read();
733-
}
734-
return -1;
735-
}
736-
737-
/**
738-
* @brief Reads multiple bytes into a buffer
739-
*
740-
* Reads from internal buffer first, then continues with main stream.
741-
*
742-
* @param data Buffer to store read data
743-
* @param len Maximum number of bytes to read
744-
* @return Number of bytes actually read
745-
*/
746-
size_t readBytes(uint8_t* data, size_t len) override {
747-
size_t total_read = 0;
748-
749-
// First read from buffer if available
750-
if (has_buffer && buffer_pos < buffer_size) {
751-
size_t buffer_available = buffer_size - buffer_pos;
752-
size_t from_buffer = min(len, buffer_available);
753-
memcpy(data, buffer_data + buffer_pos, from_buffer);
754-
buffer_pos += from_buffer;
755-
total_read += from_buffer;
756-
data += from_buffer;
757-
len -= from_buffer;
758-
759-
// If we consumed all buffer data, mark as done
760-
if (buffer_pos >= buffer_size) {
761-
has_buffer = false;
762-
}
763-
}
764-
765-
// Then read remaining from stream
766-
if (len > 0 && p_stream != nullptr) {
767-
total_read += p_stream->readBytes(data, len);
768-
}
769-
770-
return total_read;
771-
}
772-
773-
/**
774-
* @brief Write operation (not supported for input stream)
775-
*
776-
* @return 0 (write not supported)
777-
*/
778-
size_t write(uint8_t) override { return 0; } // Not used for input
779-
780-
/**
781-
* @brief Peeks at the next byte without consuming it
782-
*
783-
* @return Next byte value or -1 if no data available
784-
*/
785-
int peek() override {
786-
if (has_buffer && buffer_pos < buffer_size) {
787-
return buffer_data[buffer_pos];
788-
}
789-
if (p_stream != nullptr) {
790-
return p_stream->peek();
791-
}
792-
return -1;
793-
}
794-
795-
protected:
796-
Stream* p_stream = nullptr; ///< Main input stream
797-
uint8_t* buffer_data = nullptr; ///< Buffer data pointer
798-
size_t buffer_size = 0; ///< Size of buffer data
799-
size_t buffer_pos = 0; ///< Current position in buffer
800-
bool has_buffer = false; ///< Whether buffer has data to serve
801-
};
802673

803674
/**
804675
* @brief Information about a registered decoder
@@ -829,8 +700,8 @@ class MultiStreamingDecoder : public StreamingDecoder {
829700
Vector<StreamingDecoderAdapter*> adapters{
830701
0}; ///< Collection of internally created adapters
831702
MimeDetector mime_detector; ///< MIME type detection engine
832-
BufferedPrefixStream
833-
buffered_stream; ///< Buffered stream for data preservation
703+
BufferedStream
704+
buffered_stream{DEFAULT_BUFFER_SIZE}; ///< Buffered stream for data preservation
834705
Vector<uint8_t> detection_buffer{0}; ///< Buffer for format detection data
835706
bool is_first = true; ///< Flag for first copy() call
836707
const char* selected_mime = nullptr; ///< MIME type that was selected
@@ -882,17 +753,12 @@ class MultiStreamingDecoder : public StreamingDecoder {
882753

883754
// Allocate buffer for MIME detection sample (80 bytes is typically sufficient
884755
// for most audio format headers to be identified)
885-
detection_buffer.resize(80);
886-
size_t bytesRead = readBytes(detection_buffer.data(), detection_buffer.size());
756+
detection_buffer.resize(160);
757+
size_t bytesRead = buffered_stream.peekBytes(detection_buffer.data(), detection_buffer.size());
887758

888759
// If no data is available, we cannot proceed with detection
889760
if (bytesRead == 0) return false;
890761

891-
// Preserve the detection data for the selected decoder by setting up
892-
// the buffered stream. This ensures the data used for detection
893-
// is not lost and will be available to the decoder
894-
buffered_stream.setBuffer(detection_buffer.data(), bytesRead);
895-
896762
// Feed the sample data to the MIME detector for format analysis
897763
// The detector examines file headers, magic numbers, etc.
898764
mime_detector.write(detection_buffer.data(), bytesRead);

src/AudioTools/CoreAudio/AudioStreams.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -575,6 +575,14 @@ class BufferedStream : public ModifyingStream {
575575
}
576576
}
577577

578+
/// Provides data w/o consuming
579+
size_t peekBytes(uint8_t *data, size_t len) {
580+
if (buffer.isEmpty()) {
581+
refill();
582+
}
583+
return buffer.peekArray(data, len);
584+
}
585+
578586
/// Returns the available bytes in the buffer: to be avoided
579587
int available() override {
580588
if (buffer.isEmpty()) {

src/AudioTools/CoreAudio/Buffers.h

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -235,6 +235,15 @@ class SingleBuffer : public BaseBuffer<T> {
235235

236236
bool isFull() override { return availableForWrite() <= 0; }
237237

238+
int peekArray(uint8_t *data, int len) {
239+
int len_available = available();
240+
if (len > len_available) {
241+
len = len_available;
242+
}
243+
memcpy(data, buffer.data() + current_read_pos, len);
244+
return len;
245+
}
246+
238247
/// consumes len bytes and moves current data to the beginning
239248
int clearArray(int len) override {
240249
int len_available = available();

0 commit comments

Comments
 (0)