@@ -108,12 +108,13 @@ class MP3DecoderHelix : public CommonHelix {
108
108
void decode (Range r) {
109
109
LOG (Debug, " decode %d" , r.end );
110
110
int len = r.end ;
111
- int bytesLeft = r.end ; // r.end; //r.end; // buffer_size
112
-
113
- int result = MP3Decode (decoder, &frame_buffer + r.start , &bytesLeft, pwm_buffer, mp3_type);
114
- checkMemory ();
111
+ int bytesLeft = r.end -r.start ; // r.end; //r.end; // buffer_size
115
112
113
+ uint8_t * ptr = frame_buffer + r.start ;
114
+ int result = MP3Decode (decoder, &ptr, &bytesLeft, pwm_buffer, mp3_type);
116
115
116
+ int decoded = len - bytesLeft;
117
+
117
118
if (result==0 ){
118
119
int decoded = len - bytesLeft;
119
120
LOG (Debug, " -> bytesLeft %d -> %d = %d " , buffer_size, bytesLeft, decoded);
@@ -127,44 +128,37 @@ class MP3DecoderHelix : public CommonHelix {
127
128
// remove processed data from buffer
128
129
buffer_size -= decoded;
129
130
memmove (frame_buffer, frame_buffer+r.start +decoded, buffer_size);
130
- checkMemory ();
131
131
LOG (Debug, " -> decoded %d bytes - remaining buffer_size: %d" , decoded, buffer_size);
132
132
} else {
133
133
// decoding error
134
134
LOG (Debug, " -> decode error: %d - removing frame!" , result);
135
+ int ignore = decoded;
136
+ if (ignore == 0 ) ignore = r.end ;
135
137
// We advance to the next synch world
136
- if (r.end >0 ){
137
- buffer_size -= r.end ;
138
- memmove (frame_buffer, frame_buffer+r.end , buffer_size);
139
- checkMemory ();
140
- }
138
+ buffer_size -= ignore;
139
+ memmove (frame_buffer, frame_buffer+ignore, buffer_size);
141
140
}
142
141
}
143
142
144
143
// return the resulting PWM data
145
144
void provideResult (MP3FrameInfo &info){
146
145
LOG (Debug, " => provideResult: %d" , info.outputSamps );
147
-
148
- // provide result
149
- if (pwmCallback!=nullptr ){
150
- // output via callback
151
- pwmCallback (info, pwm_buffer, info.outputSamps );
152
- } else {
153
- // output to stream
154
- if (info.samprate !=mp3FrameInfo.samprate && infoCallback!=nullptr ){
155
- infoCallback (mp3FrameInfo);
146
+ if (info.outputSamps >0 ){
147
+ // provide result
148
+ if (pwmCallback!=nullptr ){
149
+ // output via callback
150
+ pwmCallback (info, pwm_buffer, info.outputSamps );
151
+ } else {
152
+ // output to stream
153
+ if (info.samprate !=mp3FrameInfo.samprate && infoCallback!=nullptr ){
154
+ infoCallback (mp3FrameInfo);
155
+ }
156
+ out->write ((uint8_t *)pwm_buffer, info.outputSamps );
156
157
}
157
- out-> write (( uint8_t *)pwm_buffer, info. outputSamps ) ;
158
+ mp3FrameInfo = info;
158
159
}
159
- mp3FrameInfo = info;
160
- checkMemory ();
161
160
}
162
161
163
- // / checks the consistency of the memory
164
- virtual void checkMemory (){
165
- // assert(frame_buffer[maxFrameSize()+1]==0);
166
- // assert(pwm_buffer[maxPWMSize()+1]==-1);
167
- }
168
162
169
163
};
170
164
0 commit comments