diff options
| author | Comment <tim@gray.(none)> | 2013-04-22 19:21:42 +0100 |
|---|---|---|
| committer | Comment <tim@gray.(none)> | 2013-04-22 19:21:42 +0100 |
| commit | 4b3aad507aaf75263f5b8c719768b24ba688c31e (patch) | |
| tree | 602d4d2dc89d3e39c5b76d112452e0249d3ab7f5 /rotord/libavaudioloader.cpp | |
| parent | b05e391e126f2bba2a4bd2915786d93731d2dbc9 (diff) | |
audio output corruption
Diffstat (limited to 'rotord/libavaudioloader.cpp')
| -rw-r--r-- | rotord/libavaudioloader.cpp | 61 |
1 files changed, 51 insertions, 10 deletions
diff --git a/rotord/libavaudioloader.cpp b/rotord/libavaudioloader.cpp index 8a2d81a..133fcd4 100644 --- a/rotord/libavaudioloader.cpp +++ b/rotord/libavaudioloader.cpp @@ -1,6 +1,6 @@ #include "libavaudioloader.h" -bool libav::audioloader::setup(const std::string &filename){ +bool libav::Audioloader::setup(const std::string &filename){ av_register_all(); @@ -65,16 +65,16 @@ bool libav::audioloader::setup(const std::string &filename){ av_dump_format(formatContext, 0, 0, false); //avformat.h line 1256 int samples = ((formatContext->duration + 5000)*codecContext->sample_rate)/AV_TIME_BASE; - + std::cout << "This stream has " << codecContext->channels << " channels, a sample rate of " << codecContext->sample_rate << "Hz and "<<samples <<" samples" << std::endl; std::cout << "The data is in format " <<codecContext->sample_fmt<< " (aka "<< av_get_sample_fmt_name(codecContext->sample_fmt) << ") "<<std::endl; av_init_packet(&packet); - sample_processed=0; + //sample_processed=0; ready=true; return true; } - AVFrame* libav::audioloader::get_frame() { + AVFrame* libav::Audioloader::get_frame() { if (!ready) return nullptr; @@ -124,10 +124,51 @@ bool libav::audioloader::setup(const std::string &filename){ cerr << "finished processing: "<<sample_processed << " samples of "<<samples<<", "<<((double)sample_processed*100)/samples<<"%"<< std::endl; */ - bool libav::audioloader::close() { - av_free(frame); - avcodec_close(codecContext); - avformat_close_input(&formatContext); +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<frame->channels;j++) { + buffer[(i*frame->channels)+j]=buffer[((sample_start+i)*frame->channels)+j]; + } + } + sample_start=sample_end-sample_start; + } + sample_end=sample_start; + while (sample_end<num) { + frame=get_frame(); + if (((sample_end+frame->nb_samples)*frame->channels)>buffer.size()){ + buffer.reserve((sample_end+frame->nb_samples)*frame->channels); + } + if (!frame) { + for (int i=0;i<num*frame->channels;i++){ + buffer[sample_end+i]=0; + } - return true; - }
\ No newline at end of file + } + for (int i=0;i<frame->nb_samples;i++) { + for (int j=0;j<frame->channels;j++) { + buffer[((sample_end+i)*frame->channels)+j]= ((uint16_t*) frame->buf[0])[(i*frame->channels)+j]; + } + } + sample_end+=frame->nb_samples; + //avcodec_free_frame(&frame); + } + if (sample_end>num) { + sample_start=num; + } + else { + sample_start=0; + } + return (uint16_t*)(&buffer[0]); +} + +bool libav::Audioloader::close() { + av_free(frame); + avcodec_close(codecContext); + avformat_close_input(&formatContext); + + return true; +} |
