summaryrefslogtreecommitdiff
authorllornkcor <llornkcor>2003-11-13 06:23:48 (UTC)
committer llornkcor <llornkcor>2003-11-13 06:23:48 (UTC)
commit452f0cc3d9fdd792d2050ceaffd33b3d1611fcc3 (patch) (unidiff)
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
@@ -1,232 +1,232 @@
1/**************************************************************************** 1/****************************************************************************
2 // qtrec.cpp 2 // qtrec.cpp
3 Created: Thu Jan 17 11:19:58 2002 3 Created: Thu Jan 17 11:19:58 2002
4 copyright 2002 by L.J. Potter <ljp@llornkcor.com> 4 copyright 2002 by L.J. Potter <ljp@llornkcor.com>
5****************************************************************************/ 5****************************************************************************/
6 6
7#define DEV_VERSION 7#define DEV_VERSION
8 8
9#include "pixmaps.h" 9#include "pixmaps.h"
10#include "qtrec.h" 10#include "qtrec.h"
11 11
12#include <pthread.h> 12#include <pthread.h>
13 13
14extern "C" { 14extern "C" {
15#include "adpcm.h" 15#include "adpcm.h"
16} 16}
17 17
18#include <sys/soundcard.h> 18#include <sys/soundcard.h>
19 19
20// #if defined (QTOPIA_INTERNAL_FSLP) 20// #if defined (QTOPIA_INTERNAL_FSLP)
21// #include <qpe/lnkproperties.h> 21// #include <qpe/lnkproperties.h>
22// #endif 22// #endif
23 23
24#include <qpe/config.h> 24#include <qpe/config.h>
25#include <qpe/qcopenvelope_qws.h> 25#include <qpe/qcopenvelope_qws.h>
26#include <qpe/qpeapplication.h> 26#include <qpe/qpeapplication.h>
27#include <qpe/resource.h> 27#include <qpe/resource.h>
28#include <qpe/storage.h> 28#include <qpe/storage.h>
29 29
30#include <qcheckbox.h> 30#include <qcheckbox.h>
31#include <qcombobox.h> 31#include <qcombobox.h>
32//#include <qdatetime.h> 32//#include <qdatetime.h>
33#include <qdir.h> 33#include <qdir.h>
34#include <qgroupbox.h> 34#include <qgroupbox.h>
35#include <qlabel.h> 35#include <qlabel.h>
36#include <qlayout.h> 36#include <qlayout.h>
37#include <qlistview.h> 37#include <qlistview.h>
38#include <qmessagebox.h> 38#include <qmessagebox.h>
39#include <qpopupmenu.h> 39#include <qpopupmenu.h>
40#include <qpushbutton.h> 40#include <qpushbutton.h>
41#include <qslider.h> 41#include <qslider.h>
42#include <qtabwidget.h> 42#include <qtabwidget.h>
43#include <qtimer.h> 43#include <qtimer.h>
44 44
45#include <errno.h> 45#include <errno.h>
46#include <fcntl.h> 46#include <fcntl.h>
47#include <math.h> 47#include <math.h>
48#include <mntent.h> 48#include <mntent.h>
49#include <stdio.h> 49#include <stdio.h>
50#include <stdlib.h> 50#include <stdlib.h>
51#include <sys/ioctl.h> 51#include <sys/ioctl.h>
52#include <sys/soundcard.h> 52#include <sys/soundcard.h>
53#include <sys/stat.h> 53#include <sys/stat.h>
54#include <sys/time.h> 54#include <sys/time.h>
55#include <sys/types.h> 55#include <sys/types.h>
56#include <sys/vfs.h> 56#include <sys/vfs.h>
57#include <unistd.h> 57#include <unistd.h>
58#include<sys/wait.h> 58#include<sys/wait.h>
59#include <sys/signal.h> 59#include <sys/signal.h>
60 60
61//#define ZAURUS 0 61//#define ZAURUS 0
62struct adpcm_state encoder_state; 62struct adpcm_state encoder_state;
63struct adpcm_state decoder_state; 63struct adpcm_state decoder_state;
64 64
65long findPeak(long input ); 65long findPeak(long input );
66//char deviceRates[]; 66//char deviceRates[];
67 67
68typedef struct { 68typedef struct {
69 int sampleRate; 69 int sampleRate;
70 /* int fragSize; */ 70 /* int fragSize; */
71 /* int blockSize; */ 71 /* int blockSize; */
72 int resolution; //bitrate 72 int resolution; //bitrate
73 int channels; //number of channels 73 int channels; //number of channels
74 int fd; //file descriptor 74 int fd; //file descriptor
75 int sd; //sound device descriptor 75 int sd; //sound device descriptor
76 int numberSamples; //total number of samples 76 int numberSamples; //total number of samples
77 int SecondsToRecord; // number of seconds that should be recorded 77 int SecondsToRecord; // number of seconds that should be recorded
78 float numberOfRecordedSeconds; //total number of samples recorded 78 float numberOfRecordedSeconds; //total number of samples recorded
79 int samplesToRecord; //number of samples to be recorded 79 int samplesToRecord; //number of samples to be recorded
80 int inVol; //input volume 80 int inVol; //input volume
81 int outVol; //output volume 81 int outVol; //output volume
82 int format; //wavfile format PCM.. ADPCM 82 int format; //wavfile format PCM.. ADPCM
83 const char *fileName; //name of fiel to be played/recorded 83 const char *fileName; //name of fiel to be played/recorded
84} fileParameters; 84} fileParameters;
85 85
86fileParameters filePara; 86fileParameters filePara;
87 87
88bool monitoring, recording; 88bool monitoring, recording;
89bool stopped; 89bool stopped;
90QLabel *timeLabel; 90QLabel *timeLabel;
91QSlider *timeSlider; 91QSlider *timeSlider;
92int sd; 92int sd;
93 93
94#if defined(QT_QWS_EBX) 94// #if defined(QT_QWS_EBX)
95#define DSPSTROUT "/dev/dsp" 95// #define DSPSTROUT "/dev/dsp"
96#define DSPSTRIN "/dev/dsp1" 96// #define DSPSTRIN "/dev/dsp1"
97#define DSPSTRMIXEROUT "/dev/mixer" 97// #define DSPSTRMIXEROUT "/dev/mixer"
98#define DSPSTRMIXERIN "/dev/mixer1" 98// #define DSPSTRMIXERIN "/dev/mixer1"
99#else 99// #else
100#define DSPSTROUT "/dev/dsp" 100#define DSPSTROUT "/dev/dsp"
101#define DSPSTRIN "/dev/dsp" 101#define DSPSTRIN "/dev/dsp"
102#define DSPSTRMIXERIN "/dev/mixer" 102#define DSPSTRMIXERIN "/dev/mixer"
103#define DSPSTRMIXEROUT "/dev/mixer" 103#define DSPSTRMIXEROUT "/dev/mixer"
104#endif 104//#endif
105 105
106// threaded recording 106// threaded recording
107void quickRec() { 107void quickRec() {
108//void QtRec::quickRec() { 108//void QtRec::quickRec() {
109 109
110 int total = 0; // Total number of bytes read in so far. 110 int total = 0; // Total number of bytes read in so far.
111 int bytesWritten, number; 111 int bytesWritten, number;
112 112
113 count_info info; 113 count_info info;
114 114
115 bytesWritten=0; 115 bytesWritten=0;
116 number=0; 116 number=0;
117 QString num, timeString; 117 QString num, timeString;
118 int level=0; 118 int level=0;
119 int threshold=0; 119 int threshold=0;
120 // if(limit != 0) 120 // if(limit != 0)
121 // t->start( ( limit +.3) , true); 121 // t->start( ( limit +.3) , true);
122 122
123 recording = true; 123 recording = true;
124 //rate=filePara.sampleRate; 124 //rate=filePara.sampleRate;
125 // int bits = filePara.resolution; 125 // int bits = filePara.resolution;
126 audio_buf_info inInfo; 126 audio_buf_info inInfo;
127 ioctl( filePara.fd, SNDCTL_DSP_GETISPACE, &inInfo); 127 ioctl( filePara.fd, SNDCTL_DSP_GETISPACE, &inInfo);
128 // qDebug("ispace is frags %d, total %d", inInfo.fragments, inInfo.fragstotal); 128 // qDebug("ispace is frags %d, total %d", inInfo.fragments, inInfo.fragstotal);
129 129
130 if( filePara.resolution == 16 ) { //AFMT_S16_LE) 130 if( filePara.resolution == 16 ) { //AFMT_S16_LE)
131 level=7; 131 level=7;
132 threshold=0; 132 threshold=0;
133 timeString.sprintf("%.2f", filePara.numberOfRecordedSeconds); 133 timeString.sprintf("%.2f", filePara.numberOfRecordedSeconds);
134 timeLabel->setText( timeString+ " seconds"); 134 timeLabel->setText( timeString+ " seconds");
135 135
136 if( filePara.format==WAVE_FORMAT_DVI_ADPCM) { 136 if( filePara.format==WAVE_FORMAT_DVI_ADPCM) {
137 // qDebug("start recording WAVE_FORMAT_DVI_ADPCM"); 137 // qDebug("start recording WAVE_FORMAT_DVI_ADPCM");
138 char abuf[BUFSIZE/2]; 138 char abuf[BUFSIZE/2];
139 short sbuf[BUFSIZE]; 139 short sbuf[BUFSIZE];
140 short sbuf2[BUFSIZE]; 140 short sbuf2[BUFSIZE];
141 memset( abuf,0,BUFSIZE/2); 141 memset( abuf,0,BUFSIZE/2);
142 memset( sbuf,0,BUFSIZE); 142 memset( sbuf,0,BUFSIZE);
143 memset( sbuf2,0,BUFSIZE); 143 memset( sbuf2,0,BUFSIZE);
144 144
145 for(;;) { 145 for(;;) {
146 if (stopped) { 146 if (stopped) {
147 break; // stop if playing was set to false 147 break; // stop if playing was set to false
148 } 148 }
149 149
150 number=::read( filePara.sd, sbuf, BUFSIZE); 150 number=::read( filePara.sd, sbuf, BUFSIZE);
151 if(number <= 0) { 151 if(number <= 0) {
152 perror("recording error "); 152 perror("recording error ");
153 // qDebug( "%s %d", filePara.fileName, number); 153 // qDebug( "%s %d", filePara.fileName, number);
154 // errorStop(); 154 // errorStop();
155 recording=stopped=false; 155 recording=stopped=false;
156// QMessageBox::message("Note", "Error recording to file\n%s",filePara.fileName); 156// QMessageBox::message("Note", "Error recording to file\n%s",filePara.fileName);
157 return; 157 return;
158 } 158 }
159 //if(stereo == 2) { 159 //if(stereo == 2) {
160// adpcm_coder( sbuf2, abuf, number/2, &encoder_state); 160// adpcm_coder( sbuf2, abuf, number/2, &encoder_state);
161 adpcm_coder( sbuf, abuf, number/2, &encoder_state); 161 adpcm_coder( sbuf, abuf, number/2, &encoder_state);
162 bytesWritten = ::write( filePara.fd , abuf, number/4); 162 bytesWritten = ::write( filePara.fd , abuf, number/4);
163 long peak; 163 long peak;
164 for (int i = 0; i < number; i++) 164 for (int i = 0; i < number; i++)
165 { //since Z is mono do normally 165 { //since Z is mono do normally
166 peak = findPeak((long)sbuf[i]); 166 peak = findPeak((long)sbuf[i]);
167 printf("peak %ld\r",peak); 167 printf("peak %ld\r",peak);
168 fflush(stdout); 168 fflush(stdout);
169 } 169 }
170 //------------->>>> out to file 170 //------------->>>> out to file
171 // if(filePara.channels==1) 171 // if(filePara.channels==1)
172 // total += bytesWritten/2; //mono 172 // total += bytesWritten/2; //mono
173 // else 173 // else
174 total += bytesWritten; 174 total += bytesWritten;
175 filePara.numberSamples = total; 175 filePara.numberSamples = total;
176// if( total >= filePara.samplesToRecord) 176// if( total >= filePara.samplesToRecord)
177// timeSlider->setValue(0); 177// timeSlider->setValue(0);
178// else if( filePara.SecondsToRecord !=0) 178// else if( filePara.SecondsToRecord !=0)
179 timeSlider->setValue( total); 179 timeSlider->setValue( total);
180 180
181 filePara.numberOfRecordedSeconds = (float)total / (float)filePara.sampleRate * (float)2; 181 filePara.numberOfRecordedSeconds = (float)total / (float)filePara.sampleRate * (float)2;
182 ioctl( filePara.sd, SNDCTL_DSP_GETIPTR, &info); 182 ioctl( filePara.sd, SNDCTL_DSP_GETIPTR, &info);
183 timeString.sprintf("%.2f", filePara.numberOfRecordedSeconds); 183 timeString.sprintf("%.2f", filePara.numberOfRecordedSeconds);
184 timeLabel->setText( timeString + " seconds"); 184 timeLabel->setText( timeString + " seconds");
185 185
186 qApp->processEvents(); 186 qApp->processEvents();
187 if( total >= filePara.samplesToRecord) 187 if( total >= filePara.samplesToRecord)
188 break; 188 break;
189 } 189 }
190 } else { 190 } else {
191 // qDebug("start recording WAVE_FORMAT_PCM"); 191 // qDebug("start recording WAVE_FORMAT_PCM");
192 short inbuffer[BUFSIZE], outbuffer[BUFSIZE]; 192 short inbuffer[BUFSIZE], outbuffer[BUFSIZE];
193 memset( inbuffer,0,BUFSIZE); 193 memset( inbuffer,0,BUFSIZE);
194 memset( outbuffer,0,BUFSIZE); 194 memset( outbuffer,0,BUFSIZE);
195 for(;;) { 195 for(;;) {
196 if (stopped) { 196 if (stopped) {
197 break; // stop if playing was set to false 197 break; // stop if playing was set to false
198 } 198 }
199 199
200 number=::read( filePara.sd, inbuffer, BUFSIZE); 200 number=::read( filePara.sd, inbuffer, BUFSIZE);
201 if(number <= 0) { 201 if(number <= 0) {
202 perror("recording error "); 202 perror("recording error ");
203 recording=stopped=false; 203 recording=stopped=false;
204 // errorStop(); 204 // errorStop();
205 return;// false; 205 return;// false;
206 } 206 }
207/* for (int i=0;i< number;i++) { //2*i is left channel 207/* for (int i=0;i< number;i++) { //2*i is left channel
208outbuffer[i]=inbuffer[i]>>1; // no clippy, please 208outbuffer[i]=inbuffer[i]>>1; // no clippy, please
209}*/ 209}*/
210 bytesWritten = ::write( filePara.fd , inbuffer, number); 210 bytesWritten = ::write( filePara.fd , inbuffer, number);
211//------------->>>> out to file 211//------------->>>> out to file
212 if(bytesWritten < 0) { 212 if(bytesWritten < 0) {
213 // errorStop(); 213 // errorStop();
214 perror("File writing error "); 214 perror("File writing error ");
215 return;// false; 215 return;// false;
216 } 216 }
217 217
218 // if(filePara.channels==1) 218 // if(filePara.channels==1)
219 // total += bytesWritten/2; //mono 219 // total += bytesWritten/2; //mono
220 // else 220 // else
221 total += bytesWritten; 221 total += bytesWritten;
222 long peak; 222 long peak;
223 for (int i = 0; i < number; i++) 223 for (int i = 0; i < number; i++)
224 { //since Z is mono do normally 224 { //since Z is mono do normally
225 peak = findPeak((long)inbuffer[i]); 225 peak = findPeak((long)inbuffer[i]);
226 printf("peak %ld\r",peak); 226 printf("peak %ld\r",peak);
227 fflush(stdout); 227 fflush(stdout);
228 } 228 }
229 filePara.numberSamples = total; 229 filePara.numberSamples = total;
230 if(filePara.SecondsToRecord !=0) 230 if(filePara.SecondsToRecord !=0)
231 timeSlider->setValue( total); 231 timeSlider->setValue( total);
232// printf("Writing number %d, bytes %d,total %d\r",number, bytesWritten , total); 232// printf("Writing number %d, bytes %d,total %d\r",number, bytesWritten , total);
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 @@
1/**********************************************************************
2 ** Copyright (C) 2000-2002 Trolltech AS. All rights reserved.
3 **
4 ** This file is part of the Qtopia Environment.
5 **
6 ** This file may be distributed and/or modified under the terms of the
7 ** GNU General Public License version 2 as published by the Free Software
8 ** Foundation and appearing in the file LICENSE.GPL included in the
9 ** packaging of this file.
10 **
11 ** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
12 ** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
13 **
14 ** See http://www.trolltech.com/gpl/ for GPL licensing information.
15 **
16 ** Contact info@trolltech.com if any conditions of this licensing are
17 ** not clear to you.
18 **
19 **********************************************************************/
20#include "waveform.h"
21
22#include <qlabel.h>
23#include <qpainter.h>
24
25
26Waveform::Waveform( QWidget *parent, const char *name, WFlags fl )
27 : QWidget( parent, name, fl )
28{
29 pixmap = 0;
30 windowSize = 100;
31 samplesPerPixel = 8000 / (5 * windowSize);
32 currentValue = 0;
33 numSamples = 0;
34 windowPosn = 0;
35 window = 0;
36}
37
38
39void Waveform::changeSettings( int frequency, int channels )
40{
41 makePixmap();
42// qWarning("change waveform %d, %d", frequency, channels);
43 samplesPerPixel = frequency * channels / (5 * windowSize);
44 qWarning("Waveform::changeSettings %d", samplesPerPixel);
45 if ( !samplesPerPixel )
46 samplesPerPixel = 1;
47 currentValue = 0;
48 numSamples = 0;
49 windowPosn = 0;
50 draw();
51}
52
53
54Waveform::~Waveform()
55{
56 if ( window )
57 delete[] window;
58 if ( pixmap )
59 delete pixmap;
60}
61
62
63void Waveform::reset()
64{
65 makePixmap();
66 currentValue = 0;
67 numSamples = 0;
68 windowPosn = 0;
69 draw();
70}
71
72
73void Waveform::newSamples( const short *buf, int len )
74{
75 // Cache the object values in local variables.
76 int samplesPerPixel = this->samplesPerPixel;
77 int currentValue = this->currentValue;
78 int numSamples = this->numSamples;
79 short *window = this->window;
80 int windowPosn = this->windowPosn;
81 int windowSize = this->windowSize;
82
83 // Average the incoming samples to scale them to the window.
84 while ( len > 0 ) {
85 currentValue += *buf++;
86 --len;
87 if ( ++numSamples >= samplesPerPixel ) {
88 window[windowPosn++] = (short)(currentValue / numSamples);
89 if ( windowPosn >= windowSize ) {
90 this->windowPosn = windowPosn;
91 draw();
92 windowPosn = 0;
93 }
94 numSamples = 0;
95 currentValue = 0;
96 }
97 }
98
99 // Copy the final state back to the object.
100//qWarning("%d, %d, %d", currentValue, numSamples, windowPosn);
101 this->currentValue = currentValue;
102 this->numSamples = numSamples;
103 this->windowPosn = windowPosn;
104}
105
106
107void Waveform::makePixmap()
108{
109 if ( !pixmap ) {
110 pixmap = new QPixmap( size() );
111 windowSize = pixmap->width();
112 window = new short [windowSize];
113 }
114}
115
116
117void Waveform::draw()
118{
119 pixmap->fill( Qt::black );
120 QPainter painter;
121 painter.begin( pixmap );
122 painter.setPen( Qt::green );
123
124 int middle = pixmap->height() / 2;
125 int mag;
126 short *window = this->window;
127 int posn;
128 int size = windowPosn;
129 for( posn = 0; posn < size; ++posn )
130 {
131 mag = (window[posn] * middle / 32768);
132 painter.drawLine(posn, middle - mag, posn, middle + mag);
133 }
134 if ( windowPosn < windowSize )
135 {
136 painter.drawLine(windowPosn, middle, windowSize, middle);
137 }
138
139 painter.end();
140
141 paintEvent( 0 );
142}
143
144
145void Waveform::paintEvent( QPaintEvent * )
146{
147 QPainter painter;
148 painter.begin( this );
149
150 if ( pixmap ) {
151 painter.drawPixmap( 0, 0, *pixmap );
152 } else {
153 painter.setPen( Qt::green );
154 QSize sz = size();
155 painter.drawLine(0, sz.height() / 2, sz.width(), sz.height() / 2);
156 }
157
158 painter.end();
159}
160
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 @@
1/**********************************************************************
2** Copyright (C) 2000-2002 Trolltech AS. All rights reserved.
3**
4** This file is part of the Qtopia Environment.
5**
6** This file may be distributed and/or modified under the terms of the
7** GNU General Public License version 2 as published by the Free Software
8** Foundation and appearing in the file LICENSE.GPL included in the
9** packaging of this file.
10**
11** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
12** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
13**
14** See http://www.trolltech.com/gpl/ for GPL licensing information.
15**
16** Contact info@trolltech.com if any conditions of this licensing are
17** not clear to you.
18**
19**********************************************************************/
20#ifndef WAVEFORM_H
21#define WAVEFORM_H
22
23#include <qwidget.h>
24#include <qpixmap.h>
25
26
27class QLabel;
28
29
30class Waveform : public QWidget
31{
32public:
33 Waveform( QWidget *parent=0, const char *name=0, WFlags fl=0 );
34 ~Waveform();
35
36public:
37 void changeSettings( int frequency, int channels );
38 void reset();
39 void newSamples( const short *buf, int len );
40
41private:
42
43 void makePixmap();
44 void draw();
45
46protected:
47
48 void paintEvent( QPaintEvent *event );
49
50private:
51 int samplesPerPixel;
52 int currentValue;
53 int numSamples;
54 short *window;
55 int windowPosn;
56 int windowSize;
57 QPixmap *pixmap;
58
59};
60
61
62#endif
63