arduino-audio-tools
Loading...
Searching...
No Matches
src
AudioTools
Communication
AudioSync.h
Go to the documentation of this file.
1
2
#pragma once
3
#include "
AudioTools/CoreAudio/AudioStreams.h
"
4
#include "
AudioTools/CoreAudio/AudioOutput.h
"
5
#include "
AudioTools/CoreAudio/Buffers.h
"
6
#include "
AudioTools/AudioCodecs/AudioEncoded.h
"
7
8
9
namespace
audio_tools
{
10
11
12
enum class
RecordType
:
uint8_t
{
Undefined
,
Begin
,
Send
,
Receive
,
End
};
13
enum class
AudioType
:
uint8_t
{
PCM
,
MP3
,
AAC
,
WAV
,
ADPC
};
14
enum class
TransmitRole
:
uint8_t
{
Sender
,
Receiver
};
15
17
struct
AudioHeader
{
18
AudioHeader
() =
default
;
19
uint8_t
app
= 123;
20
RecordType
rec
=
RecordType::Undefined
;
21
uint16_t
seq
= 0;
22
// record counter
23
void
increment
() {
24
static
uint16_t
static_count
= 0;
25
seq
=
static_count
++;
26
}
27
};
28
30
struct
AudioDataBegin
:
public
AudioHeader
{
31
AudioDataBegin
() {
rec
=
RecordType::Begin
; }
32
AudioInfo
info
;
33
AudioType
type
=
AudioType::PCM
;
34
};
35
37
struct
AudioSendData
:
public
AudioHeader
{
38
AudioSendData
() {
39
rec
=
RecordType::Send
;
40
}
41
uint16_t
size
= 0;
42
};
43
45
struct
AudioConfirmDataToReceive
:
public
AudioHeader
{
46
AudioConfirmDataToReceive
() {
rec
=
RecordType::Receive
; }
47
uint16_t
size
= 0;
48
};
49
51
struct
AudioDataEnd
:
public
AudioHeader
{
52
AudioDataEnd
() {
rec
=
RecordType::End
; }
53
};
54
55
62
class
AudioSyncWriter
:
public
AudioOutput
{
63
public
:
64
AudioSyncWriter
(
Stream
&
dest
) {
p_dest
= &
dest
; }
65
66
bool
begin
(
AudioInfo
&info,
AudioType
type) {
67
is_sync
=
true
;
68
AudioDataBegin
begin
;
69
begin
.
info
= info;
70
begin
.type = type;
71
begin
.increment();
72
int
write_len
=
sizeof
(
begin
);
73
int
len =
p_dest
->
write
((
const
uint8_t
*)&
begin
,
write_len
);
74
return
len ==
write_len
;
75
}
76
77
size_t
write
(
const
uint8_t
*data,
size_t
len)
override
{
78
int
written_len
= 0;
79
int
open_len
= len;
80
AudioSendData
send;
81
while
(
written_len
< len) {
82
int
available_to_write
=
waitForRequest
();
83
size_t
to_write_len
=
DEFAULT_BUFFER_SIZE
;
84
to_write_len
= min(
open_len
,
available_to_write
);
85
send.
increment
();
86
send.
size
=
to_write_len
;
87
p_dest
->
write
((
const
uint8_t
*)&send,
sizeof
(send));
88
int
w
=
p_dest
->
write
(data +
written_len
,
to_write_len
);
89
written_len
+=
w
;
90
open_len
-=
w
;
91
}
92
return
written_len
;
93
}
94
95
int
availableForWrite
()
override
{
return
available_to_write
; }
96
97
void
end
() {
98
AudioDataEnd
end
;
99
end
.
increment
();
100
p_dest
->
write
((
const
uint8_t
*)&
end
,
sizeof
(
end
));
101
}
102
103
protected
:
104
Stream
*
p_dest
;
105
int
available_to_write
= 1024;
106
bool
is_sync
;
107
109
void
waitFor
(
int
size) {
110
while
(
p_dest
->
available
() < size) {
111
delay
(10);
112
}
113
}
114
115
int
waitForRequest
() {
116
AudioConfirmDataToReceive
rcv
;
117
size_t
rcv_len
=
sizeof
(
rcv
);
118
waitFor
(
rcv_len
);
119
p_dest
->
readBytes
((
uint8_t
*)&
rcv
,
rcv_len
);
120
return
rcv
.size;
121
}
122
};
123
132
class
AudioSyncReader
:
public
AudioStream
{
133
public
:
134
AudioSyncReader
(
Stream
&in,
EncodedAudioStream
&out,
135
bool
isConfirmer
=
true
) {
136
p_in
= ∈
137
p_out
= &out;
138
is_confirmer
=
isConfirmer
;
139
}
140
141
size_t
copy
() {
142
int
processed = 0;
143
int
header_size =
sizeof
(
header
);
144
waitFor
(header_size);
145
readBytes
((
uint8_t
*)&
header
, header_size);
146
147
switch
(
header
.
rec
) {
148
case
RecordType::Begin
:
149
audioDataBegin
();
150
break
;
151
case
RecordType::End
:
152
audioDataEnd
();
153
break
;
154
case
RecordType::Send
:
155
processed =
receiveData
();
156
break
;
157
}
158
return
processed;
159
}
160
161
protected
:
162
Stream
*
p_in
;
163
EncodedAudioStream
*
p_out
;
164
AudioConfirmDataToReceive
req
;
165
AudioHeader
header
;
166
AudioDataBegin
begin
;
167
size_t
available
= 0;
// initial value
168
bool
is_started
=
false
;
169
bool
is_confirmer
;
170
int
last_seq
= 0;
171
173
void
audioDataBegin
() {
174
readProtocol
(&
begin
,
sizeof
(
begin
));
175
p_out
->
begin
();
176
p_out
->
setAudioInfo
(
begin
.
info
);
177
requestData
();
178
}
179
181
void
audioDataEnd
() {
182
AudioDataEnd
end
;
183
readProtocol
(&
end
,
sizeof
(
end
));
184
p_out
->
end
();
185
}
186
187
// Receives audio data
188
int
receiveData
() {
189
AudioSendData
data;
190
readProtocol
(&data,
sizeof
(data));
191
available
= data.
size
;
192
// receive and process audio data
193
waitFor
(
available
);
194
int
max_gap
= 10;
195
if
(data.
seq
>
last_seq
||
196
(data.
seq
<
max_gap
&&
last_seq
>= (32767 -
max_gap
))) {
197
uint8_t
buffer[
available
];
198
p_in
->
readBytes
((
uint8_t
*)buffer,
available
);
199
p_out
->
write
((
const
uint8_t
*)buffer,
available
);
200
// only one reader should be used as confirmer
201
if
(
is_confirmer
) {
202
requestData
();
203
}
204
last_seq
= data.
seq
;
205
}
206
return
available
;
207
}
208
210
void
waitFor
(
int
size) {
211
while
(
p_in
->
available
() < size) {
212
delay
(10);
213
}
214
}
215
217
void
requestData
() {
218
req
.
size
=
p_out
->
availableForWrite
();
219
req
.
increment
();
220
p_in
->
write
((
const
uint8_t
*)&
req
,
sizeof
(
req
));
221
p_in
->
flush
();
222
}
223
225
void
readProtocol
(
AudioHeader
*data,
int
len) {
226
static
const
int
header_size =
sizeof
(
header
);
227
memcpy
(data, &
header
, header_size);
228
int
read_size = len - header_size;
229
waitFor
(read_size);
230
readBytes
((
uint8_t
*)data + header_size, read_size);
231
}
232
};
233
234
}
// namespace audio_tools
AudioEncoded.h
AudioOutput.h
AudioStreams.h
Buffers.h
DEFAULT_BUFFER_SIZE
#define DEFAULT_BUFFER_SIZE
Definition
avr.h:20
audio_tools::AudioOutput
Abstract Audio Ouptut class.
Definition
AudioOutput.h:25
audio_tools::AudioOutput::begin
virtual bool begin()
Definition
AudioOutput.h:78
audio_tools::AudioStream
Base class for all Audio Streams. It support the boolean operator to test if the object is ready with...
Definition
BaseStream.h:123
audio_tools::AudioStream::readBytes
virtual size_t readBytes(uint8_t *data, size_t len) override
Definition
BaseStream.h:147
audio_tools::AudioSyncReader
Receving Audio Data over the wire and requesting for more data when done to synchronize the processin...
Definition
AudioSync.h:132
audio_tools::AudioSyncReader::audioDataEnd
void audioDataEnd()
Ends the processing.
Definition
AudioSync.h:181
audio_tools::AudioSyncReader::audioDataBegin
void audioDataBegin()
Starts the processing.
Definition
AudioSync.h:173
audio_tools::AudioSyncReader::receiveData
int receiveData()
Definition
AudioSync.h:188
audio_tools::AudioSyncReader::p_in
Stream * p_in
Definition
AudioSync.h:162
audio_tools::AudioSyncReader::waitFor
void waitFor(int size)
Waits for the data to be available.
Definition
AudioSync.h:210
audio_tools::AudioSyncReader::readProtocol
void readProtocol(AudioHeader *data, int len)
Reads the protocol record.
Definition
AudioSync.h:225
audio_tools::AudioSyncReader::available
size_t available
Definition
AudioSync.h:167
audio_tools::AudioSyncReader::is_started
bool is_started
Definition
AudioSync.h:168
audio_tools::AudioSyncReader::header
AudioHeader header
Definition
AudioSync.h:165
audio_tools::AudioSyncReader::requestData
void requestData()
Request new data from writer.
Definition
AudioSync.h:217
audio_tools::AudioSyncReader::last_seq
int last_seq
Definition
AudioSync.h:170
audio_tools::AudioSyncReader::AudioSyncReader
AudioSyncReader(Stream &in, EncodedAudioStream &out, bool isConfirmer=true)
Definition
AudioSync.h:134
audio_tools::AudioSyncReader::is_confirmer
bool is_confirmer
Definition
AudioSync.h:169
audio_tools::AudioSyncReader::begin
AudioDataBegin begin
Definition
AudioSync.h:166
audio_tools::AudioSyncReader::copy
size_t copy()
Definition
AudioSync.h:141
audio_tools::AudioSyncReader::p_out
EncodedAudioStream * p_out
Definition
AudioSync.h:163
audio_tools::AudioSyncReader::req
AudioConfirmDataToReceive req
Definition
AudioSync.h:164
audio_tools::AudioSyncWriter
Audio Writer which is synchronizing the amount of data that can be processed with the AudioReceiver.
Definition
AudioSync.h:62
audio_tools::AudioSyncWriter::waitFor
void waitFor(int size)
Waits for the data to be available.
Definition
AudioSync.h:109
audio_tools::AudioSyncWriter::available_to_write
int available_to_write
Definition
AudioSync.h:105
audio_tools::AudioSyncWriter::write
size_t write(const uint8_t *data, size_t len) override
Definition
AudioSync.h:77
audio_tools::AudioSyncWriter::p_dest
Stream * p_dest
Definition
AudioSync.h:104
audio_tools::AudioSyncWriter::availableForWrite
int availableForWrite() override
Definition
AudioSync.h:95
audio_tools::AudioSyncWriter::waitForRequest
int waitForRequest()
Definition
AudioSync.h:115
audio_tools::AudioSyncWriter::is_sync
bool is_sync
Definition
AudioSync.h:106
audio_tools::AudioSyncWriter::end
void end()
Definition
AudioSync.h:97
audio_tools::AudioSyncWriter::AudioSyncWriter
AudioSyncWriter(Stream &dest)
Definition
AudioSync.h:64
audio_tools::AudioSyncWriter::begin
bool begin(AudioInfo &info, AudioType type)
Definition
AudioSync.h:66
audio_tools::BaseStream::end
virtual void end()
Definition
BaseStream.h:44
audio_tools::EncodedAudioStream
A more natural Stream class to process encoded data (aac, wav, mp3...) which also supports the decodi...
Definition
AudioEncoded.h:271
audio_tools::EncodedAudioStream::setAudioInfo
void setAudioInfo(AudioInfo newInfo) override
Defines the input AudioInfo.
Definition
AudioEncoded.h:406
audio_tools::EncodedAudioStream::end
void end() override
Definition
AudioEncoded.h:366
audio_tools::EncodedAudioStream::write
size_t write(const uint8_t *data, size_t len) override
Definition
AudioEncoded.h:373
audio_tools::EncodedAudioStream::availableForWrite
int availableForWrite() override
Definition
AudioEncoded.h:371
audio_tools::EncodedAudioStream::begin
bool begin(AudioInfo info)
Definition
AudioEncoded.h:353
audio_tools::Print::write
virtual size_t write(const uint8_t *data, size_t len)
Definition
NoArduino.h:126
audio_tools::Print::flush
virtual void flush()
Definition
NoArduino.h:136
audio_tools::Stream
Definition
NoArduino.h:142
audio_tools::Stream::readBytes
virtual size_t readBytes(uint8_t *data, size_t len)
Definition
NoArduino.h:147
audio_tools::Stream::available
virtual int available()
Definition
NoArduino.h:146
audio_tools::AudioFormat::PCM
@ PCM
audio_tools
Generic Implementation of sound input and output for desktop environments using portaudio.
Definition
AudioCodecsBase.h:10
audio_tools::AudioType
AudioType
Definition
AudioSync.h:13
audio_tools::AudioType::PCM
@ PCM
audio_tools::AudioType::MP3
@ MP3
audio_tools::AudioType::ADPC
@ ADPC
audio_tools::AudioType::AAC
@ AAC
audio_tools::AudioType::WAV
@ WAV
audio_tools::TransmitRole
TransmitRole
Definition
AudioSync.h:14
audio_tools::TransmitRole::Sender
@ Sender
audio_tools::TransmitRole::Receiver
@ Receiver
audio_tools::ContainerType::Undefined
@ Undefined
audio_tools::delay
void delay(unsigned long ms)
Definition
Time.h:23
audio_tools::RecordType
RecordType
Definition
AudioSync.h:12
audio_tools::RecordType::Begin
@ Begin
audio_tools::RecordType::Receive
@ Receive
audio_tools::RecordType::End
@ End
audio_tools::RecordType::Send
@ Send
audio_tools::RecordType::Undefined
@ Undefined
audio_tools::writeData
size_t writeData(Print *p_out, T *data, int samples, int maxSamples=512)
Definition
AudioTypes.h:512
audio_tools::AudioConfirmDataToReceive
Protocol Record for Request.
Definition
AudioSync.h:45
audio_tools::AudioConfirmDataToReceive::AudioConfirmDataToReceive
AudioConfirmDataToReceive()
Definition
AudioSync.h:46
audio_tools::AudioConfirmDataToReceive::size
uint16_t size
Definition
AudioSync.h:47
audio_tools::AudioDataBegin
Protocal Record To Start.
Definition
AudioSync.h:30
audio_tools::AudioDataBegin::info
AudioInfo info
Definition
AudioSync.h:32
audio_tools::AudioDataBegin::type
AudioType type
Definition
AudioSync.h:33
audio_tools::AudioDataBegin::AudioDataBegin
AudioDataBegin()
Definition
AudioSync.h:31
audio_tools::AudioDataEnd
Protocol Record for End.
Definition
AudioSync.h:51
audio_tools::AudioDataEnd::AudioDataEnd
AudioDataEnd()
Definition
AudioSync.h:52
audio_tools::AudioHeader
Common Header for all records.
Definition
AudioSync.h:17
audio_tools::AudioHeader::seq
uint16_t seq
Definition
AudioSync.h:21
audio_tools::AudioHeader::app
uint8_t app
Definition
AudioSync.h:19
audio_tools::AudioHeader::rec
RecordType rec
Definition
AudioSync.h:20
audio_tools::AudioHeader::AudioHeader
AudioHeader()=default
audio_tools::AudioHeader::increment
void increment()
Definition
AudioSync.h:23
audio_tools::AudioInfo
Basic Audio information which drives e.g. I2S.
Definition
AudioTypes.h:55
audio_tools::AudioSendData
Protocol Record for Data.
Definition
AudioSync.h:37
audio_tools::AudioSendData::AudioSendData
AudioSendData()
Definition
AudioSync.h:38
audio_tools::AudioSendData::size
uint16_t size
Definition
AudioSync.h:41
Generated by
1.9.8