diff options
Diffstat (limited to 'rotord')
| -rw-r--r-- | rotord/01.mp3 | bin | 0 -> 10375915 bytes | |||
| -rw-r--r-- | rotord/01.wav | bin | 0 -> 45748270 bytes | |||
| -rw-r--r-- | rotord/02.mp3 | bin | 0 -> 6924579 bytes | |||
| -rw-r--r-- | rotord/02.wav | bin | 0 -> 30528046 bytes | |||
| -rw-r--r-- | rotord/rotor.cpp | 66 | ||||
| -rwxr-xr-x | rotord/rotor.h | 70 | ||||
| -rw-r--r-- | rotord/silence.mp3 | bin | 0 -> 481070 bytes | |||
| -rw-r--r-- | rotord/silence.wav | bin | 0 -> 2646044 bytes | |||
| -rw-r--r-- | rotord/wave.mp3 | bin | 0 -> 160913 bytes | |||
| -rw-r--r-- | rotord/wave.wav | bin | 0 -> 882044 bytes | |||
| -rw-r--r-- | rotord/wave_s.mp3 | bin | 0 -> 160913 bytes | |||
| -rw-r--r-- | rotord/wave_s.wav | bin | 0 -> 1764044 bytes |
12 files changed, 70 insertions, 66 deletions
diff --git a/rotord/01.mp3 b/rotord/01.mp3 Binary files differnew file mode 100644 index 0000000..92e9c6d --- /dev/null +++ b/rotord/01.mp3 diff --git a/rotord/01.wav b/rotord/01.wav Binary files differnew file mode 100644 index 0000000..d82faee --- /dev/null +++ b/rotord/01.wav diff --git a/rotord/02.mp3 b/rotord/02.mp3 Binary files differnew file mode 100644 index 0000000..9543612 --- /dev/null +++ b/rotord/02.mp3 diff --git a/rotord/02.wav b/rotord/02.wav Binary files differnew file mode 100644 index 0000000..1a43e7d --- /dev/null +++ b/rotord/02.wav 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; +} diff --git a/rotord/rotor.h b/rotord/rotor.h index de8e686..b7ffc25 100755 --- a/rotord/rotor.h +++ b/rotord/rotor.h @@ -336,11 +336,7 @@ namespace Rotor { class base_audio_processor { public: virtual int process_frame(uint8_t *data,int samples)=0; - void init(int _channels,int _bits,int _samples) { - channels=_channels; - bits=_bits; - samples=_samples; - }; + virtual void init(int _channels,int _bits,int _samples)=0; int channels,bits,samples; }; class audio_thumbnailer: public base_audio_processor { @@ -349,71 +345,17 @@ namespace Rotor { //draw pixels based on rms value public: audio_thumbnailer(){ - height=64; - width=128; //fit + height=16; + width=64; //fit data=new uint8_t[height*width]; memset(data,0,height*width); } ~audio_thumbnailer(){ delete[] data; } - void init(int _channels,int _bits,int _samples) { - base_audio_processor::init(_channels,_bits,_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 process_frame(uint8_t *data,int samples_in_frame){ - //begin by processing remaining samples - //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; - } - //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=(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 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; - } + void init(int _channels,int _bits,int _samples); + int process_frame(uint8_t *data,int samples_in_frame); + string print(); uint8_t *data; int height,width,samples_per_column; int column,out_sample; diff --git a/rotord/silence.mp3 b/rotord/silence.mp3 Binary files differnew file mode 100644 index 0000000..32fbbb4 --- /dev/null +++ b/rotord/silence.mp3 diff --git a/rotord/silence.wav b/rotord/silence.wav Binary files differnew file mode 100644 index 0000000..3c98ffc --- /dev/null +++ b/rotord/silence.wav diff --git a/rotord/wave.mp3 b/rotord/wave.mp3 Binary files differnew file mode 100644 index 0000000..96fd908 --- /dev/null +++ b/rotord/wave.mp3 diff --git a/rotord/wave.wav b/rotord/wave.wav Binary files differnew file mode 100644 index 0000000..98ed9ca --- /dev/null +++ b/rotord/wave.wav diff --git a/rotord/wave_s.mp3 b/rotord/wave_s.mp3 Binary files differnew file mode 100644 index 0000000..10f55d4 --- /dev/null +++ b/rotord/wave_s.mp3 diff --git a/rotord/wave_s.wav b/rotord/wave_s.wav Binary files differnew file mode 100644 index 0000000..618fb26 --- /dev/null +++ b/rotord/wave_s.wav |
