author | llornkcor <llornkcor> | 2003-11-13 06:23:48 (UTC) |
---|---|---|
committer | llornkcor <llornkcor> | 2003-11-13 06:23:48 (UTC) |
commit | 452f0cc3d9fdd792d2050ceaffd33b3d1611fcc3 (patch) (side-by-side diff) | |
tree | d391cef8c2c278f335c18344e4c6bf01589eaa50 | |
parent | a539861cbebf3517472d01ee6e9b34e9f763156e (diff) | |
download | opie-452f0cc3d9fdd792d2050ceaffd33b3d1611fcc3.zip opie-452f0cc3d9fdd792d2050ceaffd33b3d1611fcc3.tar.gz opie-452f0cc3d9fdd792d2050ceaffd33b3d1611fcc3.tar.bz2 |
added waveform
-rw-r--r-- | noncore/multimedia/opierec/qtrec.cpp | 14 | ||||
-rw-r--r-- | noncore/multimedia/opierec/waveform.cpp | 160 | ||||
-rw-r--r-- | noncore/multimedia/opierec/waveform.h | 63 |
3 files changed, 230 insertions, 7 deletions
diff --git a/noncore/multimedia/opierec/qtrec.cpp b/noncore/multimedia/opierec/qtrec.cpp index 2bf795f..1e36c96 100644 --- a/noncore/multimedia/opierec/qtrec.cpp +++ b/noncore/multimedia/opierec/qtrec.cpp @@ -1,296 +1,296 @@ /**************************************************************************** // qtrec.cpp Created: Thu Jan 17 11:19:58 2002 copyright 2002 by L.J. Potter <ljp@llornkcor.com> ****************************************************************************/ #define DEV_VERSION #include "pixmaps.h" #include "qtrec.h" #include <pthread.h> extern "C" { #include "adpcm.h" } #include <sys/soundcard.h> // #if defined (QTOPIA_INTERNAL_FSLP) // #include <qpe/lnkproperties.h> // #endif #include <qpe/config.h> #include <qpe/qcopenvelope_qws.h> #include <qpe/qpeapplication.h> #include <qpe/resource.h> #include <qpe/storage.h> #include <qcheckbox.h> #include <qcombobox.h> //#include <qdatetime.h> #include <qdir.h> #include <qgroupbox.h> #include <qlabel.h> #include <qlayout.h> #include <qlistview.h> #include <qmessagebox.h> #include <qpopupmenu.h> #include <qpushbutton.h> #include <qslider.h> #include <qtabwidget.h> #include <qtimer.h> #include <errno.h> #include <fcntl.h> #include <math.h> #include <mntent.h> #include <stdio.h> #include <stdlib.h> #include <sys/ioctl.h> #include <sys/soundcard.h> #include <sys/stat.h> #include <sys/time.h> #include <sys/types.h> #include <sys/vfs.h> #include <unistd.h> #include<sys/wait.h> #include <sys/signal.h> //#define ZAURUS 0 struct adpcm_state encoder_state; struct adpcm_state decoder_state; long findPeak(long input ); //char deviceRates[]; typedef struct { int sampleRate; /* int fragSize; */ /* int blockSize; */ int resolution; //bitrate int channels; //number of channels int fd; //file descriptor int sd; //sound device descriptor int numberSamples; //total number of samples int SecondsToRecord; // number of seconds that should be recorded float numberOfRecordedSeconds; //total number of samples recorded int samplesToRecord; //number of samples to be recorded int inVol; //input volume int outVol; //output volume int format; //wavfile format PCM.. ADPCM const char *fileName; //name of fiel to be played/recorded } fileParameters; fileParameters filePara; bool monitoring, recording; bool stopped; QLabel *timeLabel; QSlider *timeSlider; int sd; -#if defined(QT_QWS_EBX) -#define DSPSTROUT "/dev/dsp" -#define DSPSTRIN "/dev/dsp1" -#define DSPSTRMIXEROUT "/dev/mixer" -#define DSPSTRMIXERIN "/dev/mixer1" -#else +// #if defined(QT_QWS_EBX) +// #define DSPSTROUT "/dev/dsp" +// #define DSPSTRIN "/dev/dsp1" +// #define DSPSTRMIXEROUT "/dev/mixer" +// #define DSPSTRMIXERIN "/dev/mixer1" +// #else #define DSPSTROUT "/dev/dsp" #define DSPSTRIN "/dev/dsp" #define DSPSTRMIXERIN "/dev/mixer" #define DSPSTRMIXEROUT "/dev/mixer" -#endif +//#endif // threaded recording void quickRec() { //void QtRec::quickRec() { int total = 0; // Total number of bytes read in so far. int bytesWritten, number; count_info info; bytesWritten=0; number=0; QString num, timeString; int level=0; int threshold=0; // if(limit != 0) // t->start( ( limit +.3) , true); recording = true; //rate=filePara.sampleRate; // int bits = filePara.resolution; audio_buf_info inInfo; ioctl( filePara.fd, SNDCTL_DSP_GETISPACE, &inInfo); // qDebug("ispace is frags %d, total %d", inInfo.fragments, inInfo.fragstotal); if( filePara.resolution == 16 ) { //AFMT_S16_LE) level=7; threshold=0; timeString.sprintf("%.2f", filePara.numberOfRecordedSeconds); timeLabel->setText( timeString+ " seconds"); if( filePara.format==WAVE_FORMAT_DVI_ADPCM) { // qDebug("start recording WAVE_FORMAT_DVI_ADPCM"); char abuf[BUFSIZE/2]; short sbuf[BUFSIZE]; short sbuf2[BUFSIZE]; memset( abuf,0,BUFSIZE/2); memset( sbuf,0,BUFSIZE); memset( sbuf2,0,BUFSIZE); for(;;) { if (stopped) { break; // stop if playing was set to false } number=::read( filePara.sd, sbuf, BUFSIZE); if(number <= 0) { perror("recording error "); // qDebug( "%s %d", filePara.fileName, number); // errorStop(); recording=stopped=false; // QMessageBox::message("Note", "Error recording to file\n%s",filePara.fileName); return; } //if(stereo == 2) { // adpcm_coder( sbuf2, abuf, number/2, &encoder_state); adpcm_coder( sbuf, abuf, number/2, &encoder_state); bytesWritten = ::write( filePara.fd , abuf, number/4); long peak; for (int i = 0; i < number; i++) { //since Z is mono do normally peak = findPeak((long)sbuf[i]); printf("peak %ld\r",peak); fflush(stdout); } //------------->>>> out to file // if(filePara.channels==1) // total += bytesWritten/2; //mono // else total += bytesWritten; filePara.numberSamples = total; // if( total >= filePara.samplesToRecord) // timeSlider->setValue(0); // else if( filePara.SecondsToRecord !=0) timeSlider->setValue( total); filePara.numberOfRecordedSeconds = (float)total / (float)filePara.sampleRate * (float)2; ioctl( filePara.sd, SNDCTL_DSP_GETIPTR, &info); timeString.sprintf("%.2f", filePara.numberOfRecordedSeconds); timeLabel->setText( timeString + " seconds"); qApp->processEvents(); if( total >= filePara.samplesToRecord) break; } } else { // qDebug("start recording WAVE_FORMAT_PCM"); short inbuffer[BUFSIZE], outbuffer[BUFSIZE]; memset( inbuffer,0,BUFSIZE); memset( outbuffer,0,BUFSIZE); for(;;) { if (stopped) { break; // stop if playing was set to false } number=::read( filePara.sd, inbuffer, BUFSIZE); if(number <= 0) { perror("recording error "); recording=stopped=false; // errorStop(); return;// false; } /* for (int i=0;i< number;i++) { //2*i is left channel outbuffer[i]=inbuffer[i]>>1; // no clippy, please }*/ bytesWritten = ::write( filePara.fd , inbuffer, number); //------------->>>> out to file if(bytesWritten < 0) { // errorStop(); perror("File writing error "); return;// false; } // if(filePara.channels==1) // total += bytesWritten/2; //mono // else total += bytesWritten; long peak; for (int i = 0; i < number; i++) { //since Z is mono do normally peak = findPeak((long)inbuffer[i]); printf("peak %ld\r",peak); fflush(stdout); } filePara.numberSamples = total; if(filePara.SecondsToRecord !=0) timeSlider->setValue( total); // printf("Writing number %d, bytes %d,total %d\r",number, bytesWritten , total); // fflush(stdout); ioctl( filePara.sd, SNDCTL_DSP_GETIPTR, &info); // qDebug("%d, %d", info.bytes, ( info.bytes / filePara.sampleRate) / 2); filePara.numberOfRecordedSeconds = (float)total / (float)filePara.sampleRate / (float)2; timeString.sprintf("%.2f", filePara.numberOfRecordedSeconds); timeLabel->setText( timeString + " seconds"); qApp->processEvents(); if( total >= filePara.samplesToRecord) break; } } //end main loop } else { // <<<<<<<<<<<<<<<<<<<<<<< format = AFMT_U8; unsigned char unsigned_inbuffer[BUFSIZE], unsigned_outbuffer[BUFSIZE]; memset( unsigned_inbuffer, 0, BUFSIZE); memset( unsigned_outbuffer, 0, BUFSIZE); for(;;) { if (stopped) { // qDebug("quickRec:: stopped"); break; // stop if playing was set to false } number=::read( filePara.sd, unsigned_inbuffer, BUFSIZE); //-------------<<<< in from device // val = (data ^ 0x80) << 8; //unsigned_outbuffer = (unsigned_inbuffer ^ 0x80) << 8; // if(number <= 0) { // perror("recording error "); // qDebug(filePara.fileName); // // errorStop(); // QMessageBox::message("Note","error recording"); // return;// false; // } // for (int i=0;i< number;i++) { //2*i is left channel // unsigned_outbuffer[i]=unsigned_inbuffer[i]>>1; // no clippy, please // } bytesWritten = ::write( filePara.fd , unsigned_inbuffer, number); //------------->>>> out to file if(bytesWritten < 0) { recording=stopped=false; // errorStop(); QMessageBox::message("Note","There was a problem\nwriting to the file"); perror("File writing error "); return;// false; } total += bytesWritten; filePara.numberSamples = total; // printf("\nWriting number %d, bytes %d,total %d \r",number, bytesWritten , total); // fflush(stdout); if(filePara.SecondsToRecord !=0) timeSlider->setValue( total); filePara.numberOfRecordedSeconds = (float)total / (float)filePara.sampleRate; timeString.sprintf("%.2f",filePara.numberOfRecordedSeconds); timeLabel->setText( timeString + " seconds"); qApp->processEvents(); diff --git a/noncore/multimedia/opierec/waveform.cpp b/noncore/multimedia/opierec/waveform.cpp new file mode 100644 index 0000000..05be373 --- a/dev/null +++ b/noncore/multimedia/opierec/waveform.cpp @@ -0,0 +1,160 @@ +/********************************************************************** + ** Copyright (C) 2000-2002 Trolltech AS. All rights reserved. + ** + ** This file is part of the Qtopia Environment. + ** + ** This file may be distributed and/or modified under the terms of the + ** GNU General Public License version 2 as published by the Free Software + ** Foundation and appearing in the file LICENSE.GPL included in the + ** packaging of this file. + ** + ** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE + ** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. + ** + ** See http://www.trolltech.com/gpl/ for GPL licensing information. + ** + ** Contact info@trolltech.com if any conditions of this licensing are + ** not clear to you. + ** + **********************************************************************/ +#include "waveform.h" + +#include <qlabel.h> +#include <qpainter.h> + + +Waveform::Waveform( QWidget *parent, const char *name, WFlags fl ) + : QWidget( parent, name, fl ) +{ + pixmap = 0; + windowSize = 100; + samplesPerPixel = 8000 / (5 * windowSize); + currentValue = 0; + numSamples = 0; + windowPosn = 0; + window = 0; +} + + +void Waveform::changeSettings( int frequency, int channels ) +{ + makePixmap(); +// qWarning("change waveform %d, %d", frequency, channels); + samplesPerPixel = frequency * channels / (5 * windowSize); + qWarning("Waveform::changeSettings %d", samplesPerPixel); + if ( !samplesPerPixel ) + samplesPerPixel = 1; + currentValue = 0; + numSamples = 0; + windowPosn = 0; + draw(); +} + + +Waveform::~Waveform() +{ + if ( window ) + delete[] window; + if ( pixmap ) + delete pixmap; +} + + +void Waveform::reset() +{ + makePixmap(); + currentValue = 0; + numSamples = 0; + windowPosn = 0; + draw(); +} + + +void Waveform::newSamples( const short *buf, int len ) +{ + // Cache the object values in local variables. + int samplesPerPixel = this->samplesPerPixel; + int currentValue = this->currentValue; + int numSamples = this->numSamples; + short *window = this->window; + int windowPosn = this->windowPosn; + int windowSize = this->windowSize; + + // Average the incoming samples to scale them to the window. + while ( len > 0 ) { + currentValue += *buf++; + --len; + if ( ++numSamples >= samplesPerPixel ) { + window[windowPosn++] = (short)(currentValue / numSamples); + if ( windowPosn >= windowSize ) { + this->windowPosn = windowPosn; + draw(); + windowPosn = 0; + } + numSamples = 0; + currentValue = 0; + } + } + + // Copy the final state back to the object. +//qWarning("%d, %d, %d", currentValue, numSamples, windowPosn); + this->currentValue = currentValue; + this->numSamples = numSamples; + this->windowPosn = windowPosn; +} + + +void Waveform::makePixmap() +{ + if ( !pixmap ) { + pixmap = new QPixmap( size() ); + windowSize = pixmap->width(); + window = new short [windowSize]; + } +} + + +void Waveform::draw() +{ + pixmap->fill( Qt::black ); + QPainter painter; + painter.begin( pixmap ); + painter.setPen( Qt::green ); + + int middle = pixmap->height() / 2; + int mag; + short *window = this->window; + int posn; + int size = windowPosn; + for( posn = 0; posn < size; ++posn ) + { + mag = (window[posn] * middle / 32768); + painter.drawLine(posn, middle - mag, posn, middle + mag); + } + if ( windowPosn < windowSize ) + { + painter.drawLine(windowPosn, middle, windowSize, middle); + } + + painter.end(); + + paintEvent( 0 ); +} + + +void Waveform::paintEvent( QPaintEvent * ) +{ + QPainter painter; + painter.begin( this ); + + if ( pixmap ) { + painter.drawPixmap( 0, 0, *pixmap ); + } else { + painter.setPen( Qt::green ); + QSize sz = size(); + painter.drawLine(0, sz.height() / 2, sz.width(), sz.height() / 2); + } + + painter.end(); +} + diff --git a/noncore/multimedia/opierec/waveform.h b/noncore/multimedia/opierec/waveform.h new file mode 100644 index 0000000..b9a4c70 --- a/dev/null +++ b/noncore/multimedia/opierec/waveform.h @@ -0,0 +1,63 @@ +/********************************************************************** +** Copyright (C) 2000-2002 Trolltech AS. All rights reserved. +** +** This file is part of the Qtopia Environment. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.trolltech.com/gpl/ for GPL licensing information. +** +** Contact info@trolltech.com if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ +#ifndef WAVEFORM_H +#define WAVEFORM_H + +#include <qwidget.h> +#include <qpixmap.h> + + +class QLabel; + + +class Waveform : public QWidget +{ +public: + Waveform( QWidget *parent=0, const char *name=0, WFlags fl=0 ); + ~Waveform(); + +public: + void changeSettings( int frequency, int channels ); + void reset(); + void newSamples( const short *buf, int len ); + +private: + + void makePixmap(); + void draw(); + +protected: + + void paintEvent( QPaintEvent *event ); + +private: + int samplesPerPixel; + int currentValue; + int numSamples; + short *window; + int windowPosn; + int windowSize; + QPixmap *pixmap; + +}; + + +#endif + |