summaryrefslogtreecommitdiff
authorllornkcor <llornkcor>2003-11-13 06:23:48 (UTC)
committer llornkcor <llornkcor>2003-11-13 06:23:48 (UTC)
commit452f0cc3d9fdd792d2050ceaffd33b3d1611fcc3 (patch) (side-by-side diff)
treed391cef8c2c278f335c18344e4c6bf01589eaa50
parenta539861cbebf3517472d01ee6e9b34e9f763156e (diff)
downloadopie-452f0cc3d9fdd792d2050ceaffd33b3d1611fcc3.zip
opie-452f0cc3d9fdd792d2050ceaffd33b3d1611fcc3.tar.gz
opie-452f0cc3d9fdd792d2050ceaffd33b3d1611fcc3.tar.bz2
added waveform
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--noncore/multimedia/opierec/qtrec.cpp14
-rw-r--r--noncore/multimedia/opierec/waveform.cpp160
-rw-r--r--noncore/multimedia/opierec/waveform.h63
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
@@ -46,107 +46,107 @@ extern "C" {
#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 ");
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
+