diff options
Diffstat (limited to 'rotord/rotor.cpp')
| -rw-r--r-- | rotord/rotor.cpp | 66 |
1 files changed, 64 insertions, 2 deletions
diff --git a/rotord/rotor.cpp b/rotord/rotor.cpp index 85382ea..36cc6f3 100644 --- a/rotord/rotor.cpp +++ b/rotord/rotor.cpp @@ -119,7 +119,7 @@ Command_response Render_context::session_command(const std::vector<std::string>& response.description="<status context='"+command[1]+"'>Rotor: audio ready</status>\n"; response.description+="<audio>\n"; response.description+=audio_thumb->print(); - response.description+="\n</audio>"; + response.description+="</audio>"; state=IDLE; } } @@ -536,7 +536,7 @@ bool Render_context::load_audio(const string &filename,vector<base_audio_process // documentation on an FFmpeg structure or function, I just type "<name> doxygen" into google (like // "AVFrame doxygen" for AVFrame's docs) - //std::cout << "Got a frame: bytes " << bytes << std::endl; + //std::cout << "Got a frame: bytes " << bytes << ", "<<frame->nb_samples<<" samples"<<std::endl; //now we can pass the data to the processor(s) for (auto p: processors) { sample_processed=p->process_frame(frame->data[0],frame->nb_samples); @@ -633,3 +633,65 @@ Node_factory::Node_factory(){ add_type("==",new Is_new_integer()); add_type("signal_output",new Signal_output()); } +void audio_thumbnailer::init(int _channels,int _bits,int _samples) { + //base_audio_processor::init(_channels,_bits,_samples); + channels=_channels; + bits=_bits; + samples=_samples; + + + samples_per_column=samples/width; + column=0; //point thumbnail bitmap + out_sample=0; //sample in whole track + offset=(int)(pow(2.0,bits)/2.0); + scale=1.0/offset; +} +int audio_thumbnailer::process_frame(uint8_t *_data,int samples_in_frame){ + //begin by processing remaining samplesthread 4 + //samples per column could be larger than a frame! (probably is) + //but all we are doing is averaging + int bytes=(bits>>3); + int stride=channels*bytes; + int in_sample=0; + while (in_sample<samples_in_frame&&column<width) { + int sample=0; + int samples=0; + double accum=0; + while (sample<samples_per_column&&in_sample<samples_in_frame) { + //accumulate squares for this column + for (int i=0;i<channels;i++) { + int this_val=0; + for (int j=0;j<bytes;j++) { + this_val+=_data[(sample*stride)+(i*bytes)+j]<<(j*8); + } + //convert from integer data format - i.e s16p - to audio signal in -1..1 range + //don't know how many bytes we are dealing with necessarily? + double val=((double)(this_val-offset))*scale; + accum+=(val*val); + samples++; + } + in_sample++; + sample++; + out_sample++; + } + //get root-mean + double mean=pow(accum/samples,0.5); + int colheight=height*mean*0.5; + int hh=height>>1; + for (int i=0;i<height;i++) { + data[i*width+column]=abs(i-hh)<colheight?0xff:0x00; + } + column++; + } + return out_sample; +} +string audio_thumbnailer::print(){ + string output; + for (int j=0;j<height;j++) { + for (int i=0;i<width;i++) { + output+=data[j*width+i]<0x7f?"0":"1"; + } + output +="\n"; + } + return output; +} |
