11 #include "AudioCodecs/AudioEncoded.h"
33 virtual bool begin() {
36 result_buffer.resize(160 *
sizeof(int16_t));
38 input_buffer.resize(33);
41 notifyAudioChange(info);
54 operator bool() {
return is_active; }
56 virtual size_t write(
const void *data,
size_t length) {
57 LOGD(
"write: %d", length);
63 uint8_t *p_byte = (uint8_t *) data;
64 for (
int j = 0; j < length; j++) {
72 Print *p_print =
nullptr;
74 bool is_active =
false;
75 Vector<uint8_t> input_buffer;
76 Vector<uint8_t> result_buffer;
82 input_buffer[input_pos++] = byte;
85 if (input_pos >= input_buffer.size()) {
86 if (gsm_decode(v_gsm, input_buffer.data(), (gsm_signal*)result_buffer.data())!=0){
94 p_print->write(result_buffer.data(), result_buffer.size());
100 int16_t *pt16 = (int16_t *)vector.data();
101 for (
int j = 0; j < vector.size() / 2; j++) {
102 if (abs(pt16[j])<=4095){
103 pt16[j] = pt16[j] * 8;
104 }
else if(pt16[j]<0){
106 }
else if(pt16[j]>0){
112 void fromBigEndian(Vector<uint8_t> &vector){
113 int size = vector.size() / 2;
114 int16_t *data16 = (int16_t*) vector.data();
115 for (
int i=0; i<size; i++){
116 data16[i] = ntohs(data16[i]);
137 scaling_active = scaling;
144 LOGW(
"Sample rate is supposed to be 8000 - it was %d", info.
sample_rate);
147 LOGW(
"channels is supposed to be 1 - it was %d", info.
channels);
150 v_gsm = gsm_create();
152 input_buffer.resize(160 *
sizeof(int16_t));
154 result_buffer.resize(33);
165 virtual const char *
mime() {
return "audio/gsm"; }
167 virtual void setOutput(
Print &out_stream) { p_print = &out_stream; }
169 operator bool() {
return is_active; }
171 virtual size_t write(
const void *in_ptr,
size_t in_size) {
172 LOGD(
"write: %d", in_size);
178 uint8_t *p_byte = (uint8_t *) in_ptr;
179 for (
int j = 0; j < in_size; j++) {
180 processByte(p_byte[j]);
186 Print *p_print =
nullptr;
188 bool is_active =
false;
191 Vector<uint8_t> input_buffer;
192 Vector<uint8_t> result_buffer;
195 void processByte(uint8_t
byte) {
196 input_buffer[buffer_pos++] = byte;
197 if (buffer_pos >= input_buffer.size()) {
198 scaleValues(input_buffer);
201 gsm_encode(v_gsm, (gsm_signal*)input_buffer.data(), result_buffer.data());
202 size_t written = p_print->write(result_buffer.data(), result_buffer.size());
203 assert(written == result_buffer.size());
208 void toBigEndian(Vector<uint8_t> &vector){
209 int size = vector.size() / 2;
210 int16_t *data16 = (int16_t*) vector.data();
211 for (
int i=0; i<size; i++){
212 data16[i] = htons(data16[i]);
216 void scaleValues(Vector<uint8_t> &vector) {
217 int16_t *pt16 = (int16_t *)vector.data();
218 int size = vector.size() / 2;
221 for (
int j = 0; j < size; j++) {
222 pt16[j] = pt16[j] / 8;
226 for (
int j = 0; j < size; j++) {