summaryrefslogtreecommitdiff
path: root/rotord/libavaudioloader.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'rotord/libavaudioloader.cpp')
-rw-r--r--rotord/libavaudioloader.cpp52
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) {