Skip to content

Commit 81d83bb

Browse files
committed
testing BufferedStream
1 parent 3c97c11 commit 81d83bb

File tree

3 files changed

+89
-12
lines changed

3 files changed

+89
-12
lines changed
Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
/**
2+
* Testing peek and readBytes of BufferedStream
3+
* - fill DynamicMemoryStream with data
4+
* - check data of DynamicMemoryStream
5+
* - peek data
6+
* - check data vis BufferedStream
7+
*/
8+
#include "AudioTools.h"
9+
10+
DynamicMemoryStream data;
11+
BufferedStream buffered(data);
12+
HexDumpOutput out;
13+
const int processingSize = 1024;
14+
uint8_t buffer[processingSize];
15+
16+
void fillData() {
17+
Serial.println("Filling data...");
18+
for (int j = 0; j < processingSize; j++) {
19+
buffer[j] = j % 256;
20+
}
21+
while (data.size() < processingSize * 10) {
22+
assert(data.write(buffer, processingSize) == processingSize);
23+
}
24+
}
25+
26+
void testPeek() {
27+
int len = buffered.peekBytes(&buffer[0], 160);
28+
Serial.println("Peek:");
29+
out.write(buffer, len);
30+
Serial.println();
31+
}
32+
33+
void checkData(Stream &data, bool isPrint = false) {
34+
// check data
35+
Serial.print("TestingData");
36+
int n = data.readBytes(buffer, processingSize);
37+
Serial.print(" ");
38+
Serial.println(n);
39+
while (n == processingSize) {
40+
for (int j = 0; j < processingSize; j++) {
41+
uint8_t expected = j % 256;
42+
if (isPrint) {
43+
Serial.print(buffer[j]);
44+
Serial.print(", ");
45+
Serial.println(expected);
46+
}
47+
assert(buffer[j] == expected);
48+
n = data.readBytes(buffer, processingSize);
49+
assert(n == 0 || n == processingSize);
50+
}
51+
}
52+
Serial.println("test OK!");
53+
}
54+
55+
void setup() {
56+
Serial.begin(115200);
57+
AudioToolsLogger.begin(Serial, AudioToolsLogLevel::Info);
58+
delay(5000);
59+
60+
data.begin();
61+
fillData();
62+
testPeek();
63+
checkData(data);
64+
65+
data.rewind();
66+
checkData(buffered);
67+
}
68+
69+
void loop() {
70+
}

src/AudioTools/AudioCodecs/StreamingDecoder.h

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -580,6 +580,7 @@ class MultiStreamingDecoder : public StreamingDecoder {
580580
// Initialize the selected decoder and mark it as active
581581
assert(p_data_source != nullptr);
582582
actual_decoder.decoder->setInput(*p_data_source);
583+
actual_decoder.decoder->clearNotifyAudioChange();
583584
actual_decoder.decoder->addNotifyAudioChange(*this);
584585
if (actual_decoder.decoder->begin()) {
585586
actual_decoder.is_open = true;
@@ -720,8 +721,7 @@ class MultiStreamingDecoder : public StreamingDecoder {
720721
Vector<StreamingDecoderAdapter*> adapters{
721722
0}; ///< Collection of internally created adapters
722723
MimeDetector mime_detector; ///< MIME type detection engine
723-
BufferedStream
724-
buffered_stream{DEFAULT_BUFFER_SIZE}; ///< Buffered stream for data preservation
724+
BufferedStream buffered_stream{0}; ///< Buffered stream for data preservation
725725
Vector<uint8_t> detection_buffer{0}; ///< Buffer for format detection data
726726
bool is_first = true; ///< Flag for first copy() call
727727
const char* selected_mime = nullptr; ///< MIME type that was selected
@@ -779,6 +779,7 @@ class MultiStreamingDecoder : public StreamingDecoder {
779779
} else {
780780
// Option 2: Auto-detect MIME type by analyzing stream content
781781
// Redirect the decoder to use the buffered stream
782+
buffered_stream.resize(DEFAULT_BUFFER_SIZE);
782783
p_data_source = &buffered_stream;
783784

784785
// This requires reading a sample of data to identify the format
@@ -806,9 +807,6 @@ class MultiStreamingDecoder : public StreamingDecoder {
806807
LOGE("The decoder could not be selected for %s", toStr(mime));
807808
return false; // No registered decoder can handle this format
808809
}
809-
// define data source
810-
assert(p_data_source!=nullptr);
811-
actual_decoder.decoder->setInput(*p_data_source);
812810
} else {
813811
// MIME detection failed - format is unknown or unsupported
814812
LOGE("Could not determine mime type");

src/AudioTools/CoreAudio/AudioStreams.h

Lines changed: 16 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -484,31 +484,31 @@ class BufferedStream : public ModifyingStream {
484484
public:
485485
BufferedStream(size_t buffer_size) {
486486
TRACED();
487-
buffer.resize(buffer_size);
487+
if (buffer_size > 0) resize(buffer_size);
488488
}
489489

490490
BufferedStream(Print &out, size_t buffer_size = 1024) {
491491
TRACED();
492492
setOutput(out);
493-
buffer.resize(buffer_size);
493+
if (buffer_size > 0) resize(buffer_size);
494494
}
495495

496496
BufferedStream(Stream &io, size_t buffer_size = 1024) {
497497
TRACED();
498498
setStream(io);
499-
buffer.resize(buffer_size);
499+
if (buffer_size > 0) resize(buffer_size);
500500
}
501501

502502
BufferedStream(size_t buffer_size, Print &out) {
503503
TRACED();
504504
setOutput(out);
505-
buffer.resize(buffer_size);
505+
if (buffer_size > 0) resize(buffer_size);
506506
}
507507

508508
BufferedStream(size_t buffer_size, Stream &io) {
509509
TRACED();
510510
setStream(io);
511-
buffer.resize(buffer_size);
511+
if (buffer_size > 0) resize(buffer_size);
512512
}
513513

514514
void setOutput(Print &out) override { p_out = &out; }
@@ -567,7 +567,7 @@ class BufferedStream : public ModifyingStream {
567567

568568
/// Use this method !!
569569
size_t readBytes(uint8_t *data, size_t len) override {
570-
if (buffer.isEmpty()) {
570+
if (buffer.isEmpty() && len >= minReadBufferSize) {
571571
return readExt(data, len);
572572
} else {
573573
refill(len);
@@ -592,10 +592,19 @@ class BufferedStream : public ModifyingStream {
592592
/// Clears all the data in the buffer
593593
void clear() { buffer.reset(); }
594594

595+
/// Resize the buffer
596+
void resize(int size) { buffer.resize(size); }
597+
598+
/// Defines the minimum direct unbuffered read size to the original source (default is 1024)
599+
void setMinUnbufferedReadSize(size_t size) {
600+
minReadBufferSize = size;
601+
}
602+
595603
protected:
596-
SingleBuffer<uint8_t> buffer;
604+
SingleBuffer<uint8_t> buffer{0};
597605
Print *p_out = nullptr;
598606
Stream *p_in = nullptr;
607+
size_t minReadBufferSize = 1024;
599608

600609
/// refills the buffer with data from the source
601610
void refill() {

0 commit comments

Comments
 (0)