Skip to content

Commit 1d7c70c

Browse files
committed
DRAFT ContainerOgg
1 parent dbabdf2 commit 1d7c70c

File tree

3 files changed

+86
-7
lines changed

3 files changed

+86
-7
lines changed
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
/**
2+
* @file communication-codec-test.ino
3+
* @author Phil Schatzmann
4+
* @brief generate sine wave -> encoder -> decoder -> audiokit (i2s)
5+
* @version 0.1
6+
* @date 2022-04-30
7+
*
8+
* @copyright Copyright (c) 2022
9+
*
10+
*/
11+
#include "AudioTools.h"
12+
#include "AudioCodecs/ContainerOgg.h"
13+
#include "AudioLibs/AudioKit.h"
14+
15+
AudioInfo info(8000, 1, 16);
16+
SineWaveGenerator<int16_t> sineWave( 32000); // subclass of SoundGenerator with max amplitude of 32000
17+
GeneratedSoundStream<int16_t> sound( sineWave); // Stream generated from sine wave
18+
AudioKitStream out;
19+
OggContainerEncoder enc;
20+
OggContainerDecoder dec;
21+
EncodedAudioStream decoder(out, dec); // encode and write
22+
EncodedAudioStream encoder(decoder, enc); // encode and write
23+
StreamCopy copier(encoder, sound);
24+
25+
void setup() {
26+
Serial.begin(115200);
27+
AudioLogger::instance().begin(Serial, AudioLogger::Warning);
28+
29+
// start I2S
30+
Serial.println("starting I2S...");
31+
auto cfgi = out.defaultConfig(TX_MODE);
32+
cfgi.copyFrom(info);
33+
out.begin(cfgi);
34+
35+
// Setup sine wave
36+
sineWave.begin(info, N_B4);
37+
38+
// start decoder
39+
decoder.begin(info);
40+
41+
// start encoder
42+
encoder.begin(info);
43+
44+
Serial.println("Test started...");
45+
}
46+
47+
48+
void loop() {
49+
copier.copy();
50+
}
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
#include "AudioTools.h"
2+
#include "AudioCodecs/ContainerOgg.h"
3+
4+
AudioInfo info(24000, 1, 16);
5+
SineWaveGenerator<int16_t> sineWave(
6+
32000); // subclass of SoundGenerator with max amplitude of 32000
7+
GeneratedSoundStream<int16_t> sound(
8+
sineWave); // Stream generated from sine wave
9+
HexDumpStream out(Serial);
10+
OggContainerEncoder enc;
11+
EncodedAudioStream encoder(out, enc); // encode and write
12+
StreamCopy copier(encoder, sound);
13+
14+
void setup() {
15+
Serial.begin(115200);
16+
AudioLogger::instance().begin(Serial, AudioLogger::Warning);
17+
18+
// Setup sine wave
19+
sineWave.begin(info, N_B4);
20+
21+
// Opus encoder and decoder need to know the audio info
22+
encoder.begin(info);
23+
24+
copier.copyN(2);
25+
}
26+
27+
void loop() {}

src/AudioCodecs/ContainerOgg.h

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -105,7 +105,7 @@ class OggContainerDecoder : public AudioDecoder {
105105

106106
virtual size_t write(const void *in_ptr, size_t in_size) override {
107107
LOGD("write: %d", (int)in_size);
108-
if (p_print == nullptr) return 0;
108+
if (p_print == nullptr || in_ptr==nullptr) return 0;
109109

110110
// fill buffer
111111
size_t size_consumed = buffer.writeArray((uint8_t *)in_ptr, in_size);
@@ -138,8 +138,8 @@ class OggContainerDecoder : public AudioDecoder {
138138
OggContainerDecoder *self = (OggContainerDecoder *)user_handle;
139139
int len = self->buffer.readArray((uint8_t *)buf, n);
140140
self->pos += len;
141+
//self->p_print->write((uint8_t *)buf, n);
141142
return len;
142-
//return self->p_print->write((uint8_t *)buf, n);
143143
}
144144

145145
// Process full packet
@@ -236,13 +236,15 @@ class OggContainerEncoder : public AudioEncoder {
236236
virtual void setAudioInfo(AudioInfo from) override { cfg = from; }
237237

238238
virtual void begin(AudioInfo from) {
239-
setAudioInfo(cfg);
239+
setAudioInfo(from);
240240
begin();
241241
}
242242

243243
/// starts the processing using the actual AudioInfo
244244
virtual void begin() override {
245245
TRACED();
246+
assert(cfg.channels!=0);
247+
assert(cfg.sample_rate!=0);
246248
is_open = true;
247249
codec_buffer.begin();
248250
if (p_oggz == nullptr) {
@@ -277,14 +279,14 @@ class OggContainerEncoder : public AudioEncoder {
277279

278280
/// Writes raw data to be encoded and packaged
279281
virtual size_t write(const void *in_ptr, size_t in_size) override {
280-
if (!is_open || p_print == nullptr) return 0;
281-
LOGD("write: %d", (int) in_size);
282+
if (!is_open || p_print == nullptr || in_ptr==nullptr) return 0;
283+
LOGD("OggContainerEncoder::write: %d", (int) in_size);
282284

283285
if (p_codec!=nullptr){
284286
// encode the data
285287
size_t eff = p_encoded_audio_stream->write((uint8_t*)in_ptr, in_size);
286288
if (eff!=in_size){
287-
LOGE("Write overflow");
289+
LOGE("Write overflow req:%d eff:%d", in_size, eff);
288290
}
289291
// get the result from the buffer
290292
void *encoded_data = buffer.address();
@@ -338,7 +340,7 @@ class OggContainerEncoder : public AudioEncoder {
338340
virtual bool writePacket(ogg_packet &op, int flag = 0) {
339341
LOGD("writePacket: %d", (int) op.bytes);
340342
long result = oggz_write_feed(p_oggz, &op, serialno, flag, NULL);
341-
if (result < 0) {
343+
if (result < 0 && result!=OGGZ_ERR_OUT_OF_MEMORY) {
342344
LOGE("oggz_write_feed: %d", (int) result);
343345
return false;
344346
}

0 commit comments

Comments
 (0)