From 1e26d66c3a7be31a9dd214b587488dfe3ed69b4b Mon Sep 17 00:00:00 2001 From: Tim Redfern Date: Tue, 23 Apr 2013 14:01:06 +0100 Subject: writing audio but sped up for some reason --- rotord/libavaudioloader.cpp | 45 ++++++++++++++++++++++++++++++++++++++------- 1 file changed, 38 insertions(+), 7 deletions(-) (limited to 'rotord/libavaudioloader.cpp') diff --git a/rotord/libavaudioloader.cpp b/rotord/libavaudioloader.cpp index 133fcd4..b842a42 100644 --- a/rotord/libavaudioloader.cpp +++ b/rotord/libavaudioloader.cpp @@ -100,6 +100,30 @@ bool libav::Audioloader::setup(const std::string &filename){ return frame; } + AVPacket* libav::Audioloader::get_packet() { + + if (!ready) return nullptr; + + int ret=av_read_frame(formatContext, &packet); + if (ret<0) { + std::cerr << "finished with code "<index) + //{ + //int bytes = + // avcodec_decode_audio4(codecContext, frame, &frameFinished, &packet); + + // Some frames rely on multiple packets, so we have to make sure the frame is finished before + // we can use it + //} + // You *must* call av_free_packet() after each call to av_read_frame() or else you'll leak memory + //av_free_packet(&packet);????? + //} + return &packet; + + } /* // Some codecs will cause frames to be buffered up in the decoding process. If the CODEC_CAP_DELAY flag @@ -130,8 +154,8 @@ uint16_t* libav::Audioloader::get_samples(int num){ //presumes 16bpc here //shuffle down samples if (sample_start>0){ for (int i=0;ichannels;j++) { - buffer[(i*frame->channels)+j]=buffer[((sample_start+i)*frame->channels)+j]; + for (int j=0;jnb_samples)*frame->channels)>buffer.size()){ - buffer.reserve((sample_end+frame->nb_samples)*frame->channels); + 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;ichannels;i++){ + for (int i=0;inb_samples)*frame->channels)<nb_samples;i++) { - for (int j=0;jchannels;j++) { - buffer[((sample_end+i)*frame->channels)+j]= ((uint16_t*) frame->buf[0])[(i*frame->channels)+j]; + for (int j=0;jbuf[j]->data)[i]; + //uint16_t s=frame->buf[j]->data[i*2]+((frame->buf[j]->data)[i*2+1]<<8); + buffer[((sample_end+i)*frame->channels)+j]= s; } } sample_end+=frame->nb_samples; -- cgit v1.2.3