diff options
Diffstat (limited to 'rotord/libavaudioloader.cpp')
| -rw-r--r-- | rotord/libavaudioloader.cpp | 52 |
1 files changed, 30 insertions, 22 deletions
diff --git a/rotord/libavaudioloader.cpp b/rotord/libavaudioloader.cpp index 03919f0..ef84560 100644 --- a/rotord/libavaudioloader.cpp +++ b/rotord/libavaudioloader.cpp @@ -152,42 +152,50 @@ uint16_t* libav::Audioloader::get_samples(int num){ //presumes 16bpc here //std::cerr << "request "<<num<<" samples: "<<(ready?"ready":"not ready")<<std::endl; if(!ready) return nullptr; //shuffle down samples + if (sample_start>0){ for (int i=0;i<sample_end-sample_start;i++){ - for (int j=0;j<av_frame_get_channels(frame);j++) { - buffer[(i*av_frame_get_channels(frame))+j]=buffer[((sample_start+i)*av_frame_get_channels(frame))+j]; + for (int j=0;j<channels;j++) { + buffer[(i*channels)+j]=buffer[((sample_start+i)*channels)+j]; } } sample_start=sample_end-sample_start; } + sample_end=sample_start; while (sample_end<num) { - frame=get_frame(); - if (((sample_end+std::max(num,frame->nb_samples))*av_frame_get_channels(frame))>buffer.size()){ - int m=buffer.size(); - int s=((sample_end+std::max(num,frame->nb_samples))*av_frame_get_channels(frame)); - buffer.reserve(s); - std::cerr << "audioloader reserved buffer to " << s << std::endl; - for (int i=m;i<s;i++) buffer.push_back(0); + frame=get_frame(); + if (frame) { + channels=av_frame_get_channels(frame); //will always reach here 1st + if (((sample_end+std::max(num,frame->nb_samples))*channels)>buffer.size()){ + int m=buffer.size(); + int s=((sample_end+std::max(num,frame->nb_samples))*channels); + buffer.reserve(s); + std::cerr << "audioloader reserved buffer to " << s << std::endl; + for (int i=m;i<s;i++) buffer.push_back(0); + } + for (int i=0;i<frame->nb_samples;i++) { + for (int j=0;j<channels;j++) { + buffer[((sample_end+i)*frame->channels)+j]= ((uint16_t*) frame->buf[j]->data)[i]; + //temporarily disabled audio as its is SIGSEV with audio from delorentos + + + //buffer[(j*frame->channels)+(sample_end+i)]= ((uint16_t*) frame->buf[j]->data)[i]; ??planar?? nope + } + } + sample_end+=frame->nb_samples; } - if (!frame) { - for (int i=0;i<num*av_frame_get_channels(frame);i++){ - buffer[sample_end+i]=0; + else { + for (int i=sample_end;i<num;i++){ + for (int j=0;j<channels;j++) { + buffer[(channels*i)+j]=0; + } } } //std::cerr<<"filling buffer to "<<((sample_end+frame->nb_samples)*frame->channels)<<std::endl; - for (int i=0;i<frame->nb_samples;i++) { - for (int j=0;j<av_frame_get_channels(frame);j++) { - buffer[((sample_end+i)*frame->channels)+j]= ((uint16_t*) frame->buf[j]->data)[i]; - //temporarily disabled audio as its is SIGSEV with audio from delorentos - - - //buffer[(j*frame->channels)+(sample_end+i)]= ((uint16_t*) frame->buf[j]->data)[i]; ??planar?? nope - } - } - sample_end+=frame->nb_samples; + //avcodec_free_frame(&frame); } if (sample_end>num) { |
