summaryrefslogtreecommitdiff
path: root/rotord/libavaudioloader.cpp
diff options
context:
space:
mode:
authorComment <tim@gray.(none)>2013-04-22 19:21:42 +0100
committerComment <tim@gray.(none)>2013-04-22 19:21:42 +0100
commit4b3aad507aaf75263f5b8c719768b24ba688c31e (patch)
tree602d4d2dc89d3e39c5b76d112452e0249d3ab7f5 /rotord/libavaudioloader.cpp
parentb05e391e126f2bba2a4bd2915786d93731d2dbc9 (diff)
audio output corruption
Diffstat (limited to 'rotord/libavaudioloader.cpp')
-rw-r--r--rotord/libavaudioloader.cpp61
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;
+}