summaryrefslogtreecommitdiff
Side-by-side diff
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--noncore/multimedia/opierec/device.cpp286
-rw-r--r--noncore/multimedia/opierec/device.h4
-rw-r--r--noncore/multimedia/opierec/qtrec.cpp121
-rw-r--r--noncore/multimedia/opierec/waveform.cpp2
4 files changed, 125 insertions, 288 deletions
diff --git a/noncore/multimedia/opierec/device.cpp b/noncore/multimedia/opierec/device.cpp
index cb47b77..e7e0f4b 100644
--- a/noncore/multimedia/opierec/device.cpp
+++ b/noncore/multimedia/opierec/device.cpp
@@ -1,374 +1,276 @@
// device.cpp
#include "device.h"
#include <qpe/config.h>
#include <qpe/qcopenvelope_qws.h>
+#include <opie2/odebug.h>
+
/* STD */
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/ioctl.h>
#include <sys/soundcard.h>
#include <unistd.h>
#include <sys/wait.h>
#include <unistd.h>
#include <errno.h>
//extern QtRec *qperec;
+#if defined(QT_QWS_SL5XXX)
+///#if defined(QT_QWS_EBX)
+
+#define DSPSTROUT "/dev/dsp"
+#define DSPSTRMIXEROUT "/dev/mixer"
+
+#ifdef SHARP
+#define DSPSTRIN "/dev/dsp1"
+#define DSPSTRMIXERIN "/dev/mixer1"
+#else
+#define DSPSTRIN "/dev/dsp"
+#define DSPSTRMIXERIN "/dev/mixer"
+#endif
+
+#else
+
+#ifdef QT_QWS_DEVFS
+#define DSPSTROUT "/dev/sound/dsp"
+#define DSPSTRIN "/dev/sound/dsp"
+#define DSPSTRMIXERIN "/dev/sound/mixer"
+#define DSPSTRMIXEROUT "/dev/sound/mixer"
+#else
+#define DSPSTROUT "/dev/dsp"
+#define DSPSTRIN "/dev/dsp"
+#define DSPSTRMIXERIN "/dev/mixer"
+#define DSPSTRMIXEROUT "/dev/mixer"
+#endif
+
+#endif
-Device::Device( QObject * parent, const char * dsp, const char * mixr, bool record )
+Device::Device( QObject * parent, bool record )
: QObject( parent)
{
- dspstr = (char *)dsp;
- mixstr = (char *)mixr;
-
- devForm=-1;
- devCh=-1;
- devRate=-1;
+// dspstr = dsp;
+ devForm = -1;
+ devCh = -1;
+ devRate = -1;
if( !record){ //playing
- qDebug( "setting up DSP for playing" );
+ owarn << "setting up DSP for playing" << oendl;
flags = O_WRONLY;
} else { //recording
- qDebug( "setting up DSP for recording" );
+ owarn << "setting up DSP for recording" << oendl;
flags = O_RDWR;
// flags = O_RDONLY;
-
-// selectMicInput();
-
+ selectMicInput();
}
}
bool Device::openDsp() {
if( openDevice( flags) == -1) {
perror("<<<<<<<<<<<<<<ioctl(\"Open device\")");
return false;
}
return true;
}
int Device::openDevice( int flags) {
-/* pid_t pid;
- int status;
- int pipefd[2];
- char message[20];
- if (pipe(pipefd) == -1){
- perror ("Error creating pipe");
-exit(1);
- }
- switch (pid = fork()) {
- case -1:
- perror("The fork failed!");
- break;
- case 0: {
- */
-qDebug( "Opening %s",dspstr);
- if (( sd = ::open( dspstr, flags)) == -1) {
- perror("open(\"/dev/dsp\")");
- QString errorMsg="Could not open audio device\n /dev/dsp\n"
- +(QString)strerror(errno);
- qDebug( "XXXXXXXXXXXXXXXXXXXXXXX "+errorMsg );
- return -1;
- }
-
-qDebug( "Opening mixer" );
- int mixerHandle=0;
-#ifdef QT_QWS_DEVFS
- if (( mixerHandle = open("/dev/sound/mixer",O_RDWR))<0) {
-#else
- if (( mixerHandle = open("/dev/mixer",O_RDWR))<0) {
-#endif
- perror("open(\"/dev/mixer\")");
- QString errorMsg="Could not open audio device\n /dev/dsp\n"
- +(QString)strerror(errno);
- qDebug( "XXXXXXXXXXXXXXXXXXXXXX "+errorMsg );
- }
-
- if(ioctl(sd,SNDCTL_DSP_RESET,0)<0){
- perror("ioctl RESET");
- }
-// sprintf(message, "%d", sd);
-
-/* QFile f1("/pid");
- f1.open(IO_WriteOnly );
- f1.writeBlock(message, strlen(message));
- f1.close();
- */
- /* close(pipefd[0]);
- write(pipefd[1], message, sizeof(message));
- close(pipefd[1]);
- // qDebug( "" + soundDevice->sd );
- _exit(0);
- }
- default:
- // pid greater than zero is parent getting the child's pid
- printf("Child's pid is %d\n",pid);
- QString s;
- close(pipefd[1]);
- read(pipefd[0], message, sizeof(message));
- s = message;
- close(pipefd[0]);
-
-// while(wait(NULL)!=pid)
- // ;
- printf("child %ld terminated normally, return status is zero\n", (long) pid);
- */
- // filePara.sd=(long) pid;
- /* QFile f2("/pid");
- f2.open(IO_ReadOnly);
- QTextStream t(&f2);
- // for(int f=0; f < t.atEnd() ;f++) {
- s = t.readLine();
- // }
- */
-// bool ok;
-// sd = s.toInt(&ok, 10);
-// qDebug( "<<<<<<<<<<<<<>>>>>>>>>>>>"+s );
-
-// f2.close();
-// }
-::close(mixerHandle );
-// qDebug( "open device " + dspstr );
-// qDebug( "success! " + sd );
+ owarn << "Opening"<< dspstr;
+
+ if (( sd = ::open( DSPSTROUT, flags)) == -1) {
+ perror("open(\"/dev/dsp\")");
+ QString errorMsg="Could not open audio device\n /dev/dsp\n"
+ +(QString)strerror(errno);
+ qDebug( "XXXXXXXXXXXXXXXXXXXXXXX "+errorMsg );
+ return -1;
+ }
+
+ if(ioctl(sd,SNDCTL_DSP_RESET,0)<0){
+ perror("ioctl RESET");
+ }
return sd;
}
+int Device::getInVolume() {
+ unsigned int volume = 0;
+ Config cfg("qpe");
+ cfg.setGroup("Volume");
+
+ return cfg.readNumEntry("Mic");
+}
int Device::getOutVolume( ) {
unsigned int volume;
- int mixerHandle = open( mixstr, O_RDWR );
- if ( mixerHandle >= 0 ) {
- if(ioctl( mixerHandle, MIXER_READ(SOUND_MIXER_VOLUME), &volume )==-1)
- perror("<<<<<<<<<<<<<<ioctl(\"MIXER_READ\")");
- ::close( mixerHandle );
- } else
- perror("open(\"/dev/mixer\")");
- printf("<<<<<<<<<<<<<<<<<<<<output volume %d\n",volume);
-
Config cfg("qpe");
cfg.setGroup("Volume");
return cfg.readNumEntry("VolumePercent");
}
-int Device::getInVolume() {
- unsigned int volume=0;
- int mixerHandle = ::open( mixstr, O_RDWR );
- if ( mixerHandle >= 0 ) {
- if(ioctl( mixerHandle, MIXER_READ(SOUND_MIXER_MIC), &volume )==-1)
- perror("<<<<<<<<<<<<<<<ioctl(\"MIXER_READ\")");
- ::close( mixerHandle );
- } else
- perror("open(\"/dev/mixer\")");
- printf("<<<<<<<<<<<<<<input volume %d\n", volume );
- Config cfg("qpe");
- cfg.setGroup("Volume");
- return cfg.readNumEntry("Mic");
+void Device::changedInVolume(int vol ) {
+ Config cfg("qpe");
+ cfg.setGroup("Volume");
+ cfg.writeEntry("Mic", QString::number(vol ));
+ QCopEnvelope( "QPE/System", "micChange(bool)" ) << false;
}
void Device::changedOutVolume(int vol) {
- int level = (vol << 8) + vol;
- int fd = 0;
-#ifdef QT_QWS_DEVFS
- if ((fd = open("/dev/sound/mixer", O_RDWR))>=0) {
-#else
- if ((fd = open("/dev/mixer", O_RDWR))>=0) {
-#endif
- if(ioctl(fd, MIXER_WRITE(SOUND_MIXER_VOLUME), &level) == -1)
- perror("ioctl(\"MIXER_IN_WRITE\")");
-
- Config cfg("qpe");
- cfg.setGroup("Volume");
- cfg.writeEntry("VolumePercent", QString::number( vol ));
- QCopEnvelope( "QPE/System", "volumeChange(bool)" ) << false;
- qDebug("changing output vol %d" ,vol );
- }
- ::close(fd);
-}
+ Config cfg("qpe");
+ cfg.setGroup("Volume");
+ cfg.writeEntry("VolumePercent", QString::number( vol ));
-void Device::changedInVolume(int vol ) {
- int level = (vol << 8) + vol;
- int fd = 0;
-#ifdef QT_QWS_DEVFS
- if ((fd = open("/dev/sound/mixer", O_RDWR))>=0) {
-#else
- if ((fd = open("/dev/mixer", O_RDWR))>=0) {
-#endif
- if(ioctl(fd, MIXER_WRITE(SOUND_MIXER_MIC), &level) == -1)
- perror("ioctl(\"MIXER_IN_WRITE\")");
- Config cfg("qpe");
- cfg.setGroup("Volume");
- cfg.writeEntry("Mic", QString::number(vol ));
- QCopEnvelope( "QPE/System", "micChange(bool)" ) << false;
- qDebug("changing input volume %d",vol);
- }
- ::close(fd);
+ QCopEnvelope( "QPE/System", "volumeChange(bool)" ) << false;
+
+ owarn << "changing output vol " << vol << oendl;
}
bool Device::selectMicInput() {
- int md=0;
- int info=MIXER_WRITE(SOUND_MIXER_MIC);
-#ifdef QT_QWS_DEVFS
- md = ::open( "/dev/sound/mixer", O_RDWR );
-#else
- md = ::open( "/dev/mixer", O_RDWR );
-#endif
- if ( md == -1)
- perror("open(\"/dev/mixer\")");
- else {
- if( ioctl( md, SOUND_MIXER_WRITE_RECSRC, &info) == -1)
- perror("ioctl(\"SOUND_MIXER_WRITE_RECSRC\")");
- ::close(md);
- return false;
- }
- ::close(md);
+ int md = 0;
+ int info = SOUND_MASK_MIC;//MIXER_WRITE(SOUND_MIXER_MIC);
+ owarn << "sectMicInput" << oendl;
+ md = ::open( DSPSTRMIXEROUT, O_RDWR );
+
+ if ( md <= 0) {
+ QString err;
+ err.sprintf("open %s", DSPSTRMIXEROUT);
+ perror(err.latin1());
+ } else {
+ if( ioctl( md, SOUND_MIXER_WRITE_RECSRC, &info) == -1)
+ perror("ioctl(\"SOUND_MIXER_WRITE_RECSRC\")");
+ ::close(md);
+ return false;
+ }
+ ::close(md);
return true;
}
bool Device::closeDevice( bool) {
-// if(b) {//close now
-// if (ioctl( sd, SNDCTL_DSP_RESET, 0) == -1) {
-// perror("ioctl(\"SNDCTL_DSP_RESET\")");
-// }
-// } else { //let play
-// if (ioctl( sd, SNDCTL_DSP_SYNC, 0) == -1) {
-// perror("ioctl(\"SNDCTL_DSP_SYNC\")");
-// }
-// }
-
::close( sd); //close sound device
-// sdfd=0;
- // sd=0;
-// qDebug( "closed dsp" );
return true;
}
bool Device::setDeviceFormat( int form) {
qDebug( "set device res %d: %d ",form, sd );
if (ioctl( sd, SNDCTL_DSP_SETFMT, &form)==-1) { //set format
perror("ioctl(\"SNDCTL_DSP_SETFMT\")");
return false;
}
devRes=form;
return true;
}
bool Device::setDeviceChannels( int ch) {
qDebug( "set channels %d: %d",ch ,sd);
if (ioctl( sd, SNDCTL_DSP_CHANNELS, &ch)==-1) {
perror("ioctl(\"SNDCTL_DSP_CHANNELS\")");
return false;
}
devCh=ch;
return true;
}
bool Device::setDeviceRate( int rate) {
qDebug( "set rate %d: %d",rate,sd);
if (ioctl( sd, SNDCTL_DSP_SPEED, &rate) == -1) {
perror("ioctl(\"SNDCTL_DSP_SPEED\")");
return false;
}
devRate=rate;
return true;
}
int Device::getRes() {
return devRes;
}
int Device::getFormat() {
return devForm;
}
int Device::getRate() {
return devRate;
}
int Device::getChannels() {
return devCh;
}
int Device::getDeviceFormat() {
return 0;
}
int Device::getDeviceRate() {
- int dRate=0;
+ int dRate = 0;
if (ioctl( sd, SOUND_PCM_READ_RATE, &dRate) == -1) {
perror("ioctl(\"SNDCTL_PCM_READ_RATE\")");
}
return dRate;
}
int Device::getDeviceBits() {
- int dBits=0;
-#ifndef QT_QWS_EBX // zaurus doesnt have this
+ int dBits = 0;
if (ioctl( sd, SOUND_PCM_READ_BITS, &dBits) == -1) {
perror("ioctl(\"SNDCTL_PCM_READ_BITS\")");
}
-#endif
return dBits;
}
int Device::getDeviceChannels() {
- int dCh=0;
+ int dCh = 0;
if (ioctl( sd, SOUND_PCM_READ_CHANNELS, &dCh) == -1) {
perror("ioctl(\"SNDCTL_PCM_READ_CHANNELS\")");
}
return dCh;
}
int Device::getDeviceFragSize() {
int frag_size;
if (ioctl( sd, SNDCTL_DSP_GETBLKSIZE, &frag_size) == -1) {
qDebug( "no fragsize" );
} else {
qDebug( "driver says frag size is %d",frag_size);
}
return frag_size;
}
bool Device::setFragSize(int frag) {
if (ioctl(sd, SNDCTL_DSP_SETFRAGMENT, &frag)) {
perror("ioctl(\"SNDCTL_DSP_SETFRAGMENT\")");
return false;
}
return true;
}
bool Device::reset() {
closeDevice(true);
openDsp();
if (ioctl( sd, SNDCTL_DSP_RESET, 0) == -1) {
perror("ioctl(\"SNDCTL_DSP_RESET\")");
return false;
}
return true;
}
int Device::devRead(int soundDescriptor, short *buf, int size) {
Q_UNUSED(soundDescriptor);
- int number = 0;
- number = ::read( sd /*soundDescriptor*/, (char *)buf, size);
- return number;
+ int number = 0;
+ number = ::read( sd /*soundDescriptor*/, (char *)buf, size);
+ return number;
}
int Device::devWrite(int soundDescriptor, short * buf, int size) {
Q_UNUSED(soundDescriptor);
int bytesWritten = 0;
- bytesWritten = ::write( sd /*soundDescriptor*/, buf, size);
- return bytesWritten;
+ bytesWritten = ::write( sd /*soundDescriptor*/, buf, size);
+ return bytesWritten;
}
-
-
diff --git a/noncore/multimedia/opierec/device.h b/noncore/multimedia/opierec/device.h
index 8152e85..dbc7b00 100644
--- a/noncore/multimedia/opierec/device.h
+++ b/noncore/multimedia/opierec/device.h
@@ -1,48 +1,48 @@
#ifndef DEVICE_H
#define DEVICE_H
#include <qobject.h>
#include <sys/soundcard.h>
class Device : public QObject {
Q_OBJECT
public:
- Device( QObject * parent=0, const char * dspStr=0, const char * mixerStr=0, bool record=0 );
+ Device( QObject * parent=0, bool record=0 );
~Device() {};
bool closeDevice( bool);
int getChannels();
int getFormat();
int getInVolume();
int getOutVolume();
int getRate();
int getRes();
int sd; //sound descriptor
void changedInVolume(int);
void changedOutVolume(int);
bool openDsp();
int getDeviceFormat();
int getDeviceRate();
int getDeviceBits();
int getDeviceChannels();
int getDeviceFragSize();
bool setFragSize(int);
bool setDeviceChannels(int);
bool setDeviceRate(int);
bool setDeviceFormat(int);
bool reset();
int devRead(int, short *, int);
int devWrite(int, short *, int);
private:
int devRes, devCh, devRate, devForm, flags;
- char *dspstr, *mixstr;
+ QString dspstr, mixstr;
bool selectMicInput();
int openDevice( int );
private slots:
protected:
};
#endif
diff --git a/noncore/multimedia/opierec/qtrec.cpp b/noncore/multimedia/opierec/qtrec.cpp
index 6793b4e..e827083 100644
--- a/noncore/multimedia/opierec/qtrec.cpp
+++ b/noncore/multimedia/opierec/qtrec.cpp
@@ -1,2115 +1,2050 @@
/****************************************************************************
// qtrec.cpp
Created: Thu Jan 17 11:19:58 2002
copyright 2002 by L.J. Potter <ljp@llornkcor.com>
****************************************************************************/
-#define DEV_VERSION
+//#define DEV_VERSION
#include "pixmaps.h"
#include "qtrec.h"
#include "waveform.h"
extern "C" {
#include "adpcm.h"
}
/* OPIE */
#include <opie2/odebug.h>
#include <qpe/config.h>
#include <qpe/qcopenvelope_qws.h>
#include <qpe/qpeapplication.h>
#include <qpe/resource.h>
#include <qpe/storage.h>
using namespace Opie::Core;
/* QT */
#include <qcheckbox.h>
#include <qcombobox.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>
/* STD */
#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>
#include <pthread.h>
#ifdef PDAUDIO //ALSA
#include <alsa/asoundlib.h>
static int deviceSampleRates[8] = { 32000, 44100, 48000, 88200, 96000, 176400, 192000, -1 };
static int deviceBitRates[] = { 8, 16, 24, 32, -1 };
#else //OSS
static int deviceSampleRates[6] = { 11025, 16000, 22050, 32000, 44100, -1 };
static int deviceBitRates[] = { 8, 16, -1 };
#endif
-#if defined(QT_QWS_SL5XXX)
-///#if defined(QT_QWS_EBX)
-
-#define DSPSTROUT "/dev/dsp"
-#define DSPSTRMIXEROUT "/dev/mixer"
-
-#ifdef SHARP
-#define DSPSTRIN "/dev/dsp1"
-#define DSPSTRMIXERIN "/dev/mixer1"
-#else
-#define DSPSTRIN "/dev/dsp"
-#define DSPSTRMIXERIN "/dev/mixer"
-#endif
-
-#else
-
-#ifdef QT_QWS_DEVFS
-#define DSPSTROUT "/dev/sound/dsp"
-#define DSPSTRIN "/dev/sound/dsp"
-#define DSPSTRMIXERIN "/dev/sound/mixer"
-#define DSPSTRMIXEROUT "/dev/sound/mixer"
-#else
-#define DSPSTROUT "/dev/dsp"
-#define DSPSTRIN "/dev/dsp"
-#define DSPSTRMIXERIN "/dev/mixer"
-#define DSPSTRMIXEROUT "/dev/mixer"
-#endif
-
-#endif
//#define ZAURUS 0
struct adpcm_state encoder_state;
struct adpcm_state decoder_state;
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, playing;
bool stopped;
QLabel *timeLabel;
QSlider *timeSlider;
int sd;
Waveform* waveform;
Device *soundDevice;
#ifdef THREADED
void quickRec()
#else
void QtRec::quickRec()
#endif
{
odebug << ( filePara.numberSamples/filePara.sampleRate * filePara.channels ) << oendl;
odebug << "samples " << filePara.numberSamples << ", rate " << filePara.sampleRate
<< ", channels " << filePara.channels << oendl;
int total = 0; // Total number of bytes read in so far.
int bytesWritten, number;
bytesWritten = 0;
number = 0;
QString num;
int level = 0;
int threshold = 0;
int bits = filePara.resolution;
odebug << "bits " << bits << "" << oendl;
if( filePara.resolution == 16 ) { //AFMT_S16_LE)
odebug << "AFMT_S16_LE size " << filePara.SecondsToRecord << "" << oendl;
odebug << "samples to record " << filePara.samplesToRecord << "" << oendl;
odebug << "" << filePara.sd << "" << oendl;
level = 7;
threshold = 0;
if( filePara.format == WAVE_FORMAT_DVI_ADPCM) {
odebug << "start recording WAVE_FORMAT_DVI_ADPCM" << oendl;
// <<<<<<<<<<<<<<<<<<<<<<<<<<< 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) {
odebug << "quickRec:: stopped" << oendl;
break;
}
// number=::read( filePara.sd, sbuf, BUFSIZE);
number = soundDevice->devRead( filePara.sd, sbuf, BUFSIZE);
if(number <= 0) {
perror("recording error ");
odebug << "" << filePara.fileName << " " << number << "" << oendl;
stopped = true;
return;
}
//if(stereo == 2) {
// adpcm_coder( sbuf2, abuf, number/2, &encoder_state);
adpcm_coder( sbuf, abuf, number/2, &encoder_state);
bytesWritten = ::write( filePara.fd , (short *)abuf, number/4);
waveform->newSamples( sbuf, number );
total += bytesWritten;
filePara.numberSamples = total;
timeSlider->setValue( total);
- printf("%d, bytes %d,total %d\r",number, bytesWritten, total);
- fflush(stdout);
+ printf("%d, bytes %d,total %d\r", number, bytesWritten, total);
+ fflush(stdout);
filePara.numberOfRecordedSeconds = (float)total / (float)filePara.sampleRate * (float)2 / filePara.channels;
qApp->processEvents();
if( total >= filePara.samplesToRecord) {
stopped = true;
break;
}
}
} else {
// <<<<<<<<<<<<<<<<<<<<<<<<<<< WAVE_FORMAT_PCM >>>>>>>>>>>>>>>>>>>>>>
odebug << "start recording WAVE_FORMAT_PCM" << oendl;
short inbuffer[ BUFSIZE ], outbuffer[ BUFSIZE ];
memset( inbuffer, 0, BUFSIZE);
memset( outbuffer, 0, BUFSIZE);
for(;;) {
if ( stopped) {
odebug << "quickRec:: stopped" << oendl;
stopped = true;
break; // stop if playing was set to false
return;
}
number = soundDevice->devRead( soundDevice->sd /*filePara.sd*/, (short *)inbuffer, BUFSIZE);
if( number <= 0) {
perror( "recording error ");
odebug << filePara.fileName << oendl;
stopped = true;
return;
}
bytesWritten = ::write( filePara.fd , inbuffer, number);
waveform->newSamples( inbuffer, number );
if( bytesWritten < 0) {
perror("File writing error ");
stopped = true;
return;
}
total += bytesWritten;
filePara.numberSamples = total;
if( filePara.SecondsToRecord != 0)
timeSlider->setValue( total);
- printf("%d, bytes %d,total %d\r",number, bytesWritten , total);
- fflush(stdout);
+ printf("%d, bytes %d,total %d\r",number, bytesWritten , total);
+ fflush(stdout);
filePara.numberOfRecordedSeconds = (float)total / (float)filePara.sampleRate
/ (float)2/filePara.channels;
qApp->processEvents();
if( total >= filePara.samplesToRecord) {
stopped = true;
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) {
odebug << "quickRec:: stopped" << oendl;
break; // stop if playing was set to false
}
number = ::read( soundDevice->sd /*filePara.sd*/ , unsigned_inbuffer, BUFSIZE);
bytesWritten = ::write( filePara.fd , unsigned_inbuffer, number);
waveform->newSamples( (const short *) unsigned_inbuffer, number );
if(bytesWritten < 0) {
stopped = true;
QMessageBox::message("Note","<p>There was a problem writing to the file</p>");
perror("File writing error ");
return;
}
total += bytesWritten;
filePara.numberSamples = total;
// printf("%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;
qApp->processEvents();
if( total >= filePara.samplesToRecord) {
stopped = true;
break;
}
} //end main loop
}
+ printf("\n");
} /// END quickRec()
#ifdef THREADED
void playIt()
#else
void QtRec::playIt()
#endif
{
int bytesWritten = 0;
int number = 0;
int total = 0; // Total number of bytes read in so far.
if( filePara.resolution == 16 ) { //AFMT_S16_LE) {
if( filePara.format == WAVE_FORMAT_DVI_ADPCM) {
char abuf[ BUFSIZE / 2 ];
short sbuf[ BUFSIZE ];
short sbuf2[ BUFSIZE * 2 ];
memset( abuf, 0, BUFSIZE / 2);
memset( sbuf, 0, BUFSIZE);
memset( sbuf2, 0, BUFSIZE * 2);
// <<<<<<<<<<<<<<<<<<<<<<<<<<< WAVE_FORMAT_DVI_ADPCM >>>>>>>>>>>>>>>>>>>>>>
for(;;) { // play loop
if ( stopped) {
break;
return;
}// stop if playing was set to false
number = ::read( filePara.fd, abuf, BUFSIZE / 2);
adpcm_decoder( abuf, sbuf, number * 2, &decoder_state);
// for (int i=0;i< number * 2; 2 * i++) { //2*i is left channel
// sbuf2[i+1]=sbuf2[i]=sbuf[i];
// }
bytesWritten = write ( filePara.sd, sbuf, number * 4);
waveform->newSamples( (const short *)sbuf, number *4);
// if(filePara.channels==1)
// total += bytesWritten/2; //mono
// else
total += bytesWritten;
filePara.numberSamples = total/4;
filePara.numberOfRecordedSeconds = (float)total / (float)filePara.sampleRate / 2;
timeSlider->setValue( total/4);
// timeString.sprintf("%.2f", filePara.numberOfRecordedSeconds);
// if(filePara.numberOfRecordedSeconds>1)
// timeLabel->setText( timeString+ tr(" seconds"));
// printf("playing number %d, bytes %d, total %d\n",number, bytesWritten, total/4);
// fflush(stdout);
qApp->processEvents();
if( /*total >= filePara.numberSamples || */ bytesWritten == 0) {
// if( total >= filePara.numberSamples ){//|| secCount > filePara.numberOfRecordedSeconds ) {
stopped = true;
break;
}
}
} else {
// <<<<<<<<<<<<<<<<<<<<<<<<<<< WAVE_FORMAT_PCM >>>>>>>>>>>>>>>>>>>>>>
short inbuffer[ BUFSIZE ], outbuffer[ BUFSIZE ];
memset( inbuffer, 0, BUFSIZE);
memset( outbuffer, 0, BUFSIZE);
for(;;) { // play loop
if ( stopped) {
break;
return;
}
// stop if playing was set to false
number = ::read( filePara.fd, inbuffer, BUFSIZE);
// for (int i=0;i< number * 2; 2 * i++) { //2*i is left channel
// // for (int i=0;i< number ; i++) { //2*i is left channel
// outbuffer[i+1]= outbuffer[i]=inbuffer[i];
// }
bytesWritten = ::write( filePara.sd, inbuffer, number);
waveform->newSamples( inbuffer, number);
//-------------->>>> out to device
// total+=bytesWritten;
// if(filePara.channels==1)
// total += bytesWritten/2; //mono
// else
total += bytesWritten;
timeSlider->setValue( total);
filePara.numberSamples = total;
filePara.numberOfRecordedSeconds = (float)total / (float)filePara.sampleRate / (float)2;
// timeString.sprintf("%.2f",filePara.numberOfRecordedSeconds);
// timeLabel->setText( timeString + tr(" seconds"));
qApp->processEvents();
if( /*total >= filePara.numberSamples || */ bytesWritten == 0) {
owarn << "Jane! Stop this crazy thing!" << oendl;
stopped = true;
// playing = false;
break;
}
}
// printf("\nplaying number %d, bytes %d, total %d\r",number, bytesWritten, total);
// fflush(stdout);
} //end loop
} else {
/////////////////////////////// format = AFMT_U8;
unsigned char unsigned_inbuffer[ BUFSIZE ]; //, unsigned_outbuffer[BUFSIZE];
memset( unsigned_inbuffer, 0, BUFSIZE);
for(;;) {
// main loop
if (stopped) {
break; // stop if playing was set to false
return;
}
number = ::read( filePara.fd, unsigned_inbuffer, BUFSIZE);
//data = (val >> 8) ^ 0x80;
// unsigned_outbuffer = (unsigned_inbuffer >> 8) ^ 0x80;
bytesWritten = write ( filePara.sd, unsigned_inbuffer, number);
waveform->newSamples( (const short *)unsigned_inbuffer, bytesWritten );
total += bytesWritten;
timeSlider->setValue( total);
filePara.numberSamples = total;
filePara.numberOfRecordedSeconds = (float)total / (float)filePara.sampleRate;
// timeString.sprintf("%.2f",filePara.numberOfRecordedSeconds);
// timeLabel->setText( timeString + tr(" seconds"));
qApp->processEvents();
if( /*total >= filePara.numberSamples || */ bytesWritten == 0) {
// if( total >= filePara.numberSamples ) {
stopped = true;
break;
}
// printf("Writing number %d, bytes %d, total %d, numberSamples %d\r",number, bytesWritten , total, filePara.numberSamples);
// fflush(stdout);
}
}
}
QtRec::QtRec( QWidget* parent, const char* name, WFlags fl )
: QWidget( parent, name, fl )
{
if ( !name )
setName( "OpieRec" );
init();
initConfig();
initConnections();
renameBox = 0;
// open sound device to get volumes
Config hwcfg("OpieRec");
hwcfg.setGroup("Hardware");
- soundDevice = new Device( this,
- hwcfg.readEntry( "Audio",DSPSTROUT),
- hwcfg.readEntry( "Mixer",DSPSTRMIXEROUT), false);
-// soundDevice = new Device( this, hwcfg.readEntry( "Audio","hw:0"), hwcfg.readEntry( "Mixer","hw:0"), false);
-
-// soundDevice->setDeviceFormat(AFMT_S16_LE);
-// soundDevice->setDeviceChannels(1);
-// soundDevice->setDeviceRate( 22050);
+ soundDevice = new Device( this, false); //open play
getInVol();
getOutVol();
soundDevice->closeDevice( true);
soundDevice->sd = -1;
soundDevice = 0;
wavFile = 0;
// if( soundDevice) delete soundDevice;
QTimer::singleShot(100,this, SLOT(initIconView()));
if( autoMute)
doMute( true);
// ListView1->setFocus();
playing = false;
}
QtRec::~QtRec() {
// if( soundDevice) delete soundDevice;
}
void QtRec::cleanUp() {
if( !stopped) {
stopped = true;
endRecording();
}
ListView1->clear();
if( autoMute)
doMute(false);
// if( wavFile) delete wavFile;
// if(soundDevice) delete soundDevice;
}
void QtRec::init() {
needsStereoOut = false;
QPixmap image3( ( const char** ) image3_data );
QPixmap image4( ( const char** ) image4_data );
QPixmap image6( ( const char** ) image6_data );
stopped = true;
- setCaption( tr( "OpieRecord " ) + QString::number(VERSION) );
+ setCaption( tr( "OpieRecord " ));
QGridLayout *layout = new QGridLayout( this );
layout->setSpacing( 2);
layout->setMargin( 2);
TabWidget = new QTabWidget( this, "TabWidget" );
layout->addMultiCellWidget(TabWidget, 0, 7, 0, 8);
// TabWidget->setTabShape(QTabWidget::Triangular);
///**********<<<<<<<<<<<<>>>>>>>>>>>>***************
tab = new QWidget( TabWidget, "tab" );
QGridLayout *layout1 = new QGridLayout( tab);
layout1->setSpacing( 2);
layout1->setMargin( 2);
timeSlider = new QSlider( 0,100,10,0, QSlider::Horizontal, tab, (const char *) "timeSlider" );
layout1->addMultiCellWidget( timeSlider, 1, 1, 0, 3);
// timeLabel = new QLabel( tab, "TimeLabel" );
// layout1->addMultiCellWidget( timeLabel, 0, 0, 0, 3);
// playLabel2 = new QLabel(tab, "PlayLabel2" );
// playLabel2->setText(tr("Play") );
// playLabel2->setFixedHeight( 18);
// layout1->addMultiCellWidget( playLabel2, 0, 0, 4, 4);
Stop_PushButton = new QPushButton( tab, "Stop_PushButton" );
layout1->addMultiCellWidget( Stop_PushButton, 1, 1, 4, 4);
Stop_PushButton->setFixedSize( 22, 22);
Stop_PushButton->setPixmap( image4 );
toBeginningButton = new QPushButton( tab, "Beginning_PushButton" );
layout1->addMultiCellWidget(toBeginningButton, 1, 1, 5, 5);
toBeginningButton->setFixedSize( 22, 22);
toBeginningButton->setPixmap( Resource::loadPixmap("fastback") );
toEndButton = new QPushButton( tab, "End_PushButton" );
layout1->addMultiCellWidget( toEndButton, 1, 1, 6, 6);
toEndButton->setFixedSize( 22, 22);
toEndButton->setPixmap( Resource::loadPixmap( "fastforward" ) );
// QLabel *recLabel2;
// recLabel2 = new QLabel( tab, "recLabel2" );
// recLabel2->setText(tr("Rec"));
// recLabel2->setFixedHeight( 18);
// layout1->addMultiCellWidget( recLabel2, 0, 0, 7, 7);
Rec_PushButton = new QPushButton( tab, "Rec_PushButton" );
layout1->addMultiCellWidget( Rec_PushButton, 1, 1, 7, 7);
Rec_PushButton->setFixedSize( 22, 22);
Rec_PushButton->setPixmap( image6 );
t = new QTimer( this );
connect( t, SIGNAL( timeout() ), SLOT( timerBreak() ) );
rewindTimer = new QTimer( this );
connect( rewindTimer, SIGNAL( timeout() ),
this, SLOT( rewindTimerTimeout() ) );
forwardTimer = new QTimer( this );
connect( forwardTimer, SIGNAL( timeout() ),
this, SLOT( forwardTimerTimeout() ) );
deleteSoundButton = new QPushButton( tab, "deleteSoundButton" );
layout1->addMultiCellWidget( deleteSoundButton, 1, 1, 8, 8);
deleteSoundButton->setText( tr( "Del" ) );
ListView1 = new QListView( tab, "IconView1" );
layout1->addMultiCellWidget( ListView1, 2, 2, 0, 8);
ListView1->addColumn( tr( "Name" ) );
-// ListView1->setColumnWidth( 0, 140);
ListView1->setSorting( 1, false);
ListView1->addColumn( tr( "Time" ) ); //in seconds
-// ListView1->setColumnWidth( 1, -1);
-// ListView1->addColumn( tr("Location") );
-// ListView1->setColumnWidth( 2, -1);
-// ListView1->addColumn( tr("Date") );
-// ListView1->setColumnWidth( 3, -1);
ListView1->setColumnWidthMode(0, QListView::Maximum);
-// ListView1->setColumnWidthMode(1, QListView::Maximum);
-
-// ListView1->setColumnWidthMode( 0, QListView::Manual);
ListView1->setColumnAlignment( 1, QListView::AlignCenter);
-// ListView1->setColumnAlignment( 2, QListView::AlignRight);
-// ListView1->setColumnAlignment( 3, QListView::AlignLeft);
ListView1->setAllColumnsShowFocus( true );
QPEApplication::setStylusOperation( ListView1->viewport(), QPEApplication::RightOnHold);
TabWidget->insertTab( tab, tr( "Files" ) );
///**********<<<<<<<<<<<<>>>>>>>>>>>>***************
tab_3 = new QWidget( TabWidget, "tab_3" );
QGridLayout *glayout3 = new QGridLayout( tab_3 );
glayout3->setSpacing( 2);
glayout3->setMargin( 2);
////////////////////////////////////
sampleGroup = new QGroupBox( tab_3, "samplegroup" );
sampleGroup->setTitle( tr( "Sample Rate" ) );
sampleGroup->setFixedSize( 95,50);
sampleRateComboBox = new QComboBox( false, sampleGroup, "SampleRateComboBox" );
sampleRateComboBox->setGeometry( QRect( 10, 20, 80, 25 ) );
-//#ifndef QT_QWS_EBX
QString s;
int z = 0;
while( deviceSampleRates[z] != -1) {
sampleRateComboBox->insertItem( s.setNum( deviceSampleRates[z], 10));
z++;
}
glayout3->addMultiCellWidget( sampleGroup, 0, 0, 0, 0);
sizeGroup= new QGroupBox( tab_3, "sizeGroup" );
sizeGroup->setTitle( tr( "Limit Size" ) );
sizeGroup->setFixedSize( 80, 50);
sizeLimitCombo = new QComboBox( false, sizeGroup, "sizeLimitCombo" );
sizeLimitCombo ->setGeometry( QRect( 5, 20, 70, 25 ) );
sizeLimitCombo->insertItem(tr("Unlimited"));
for(int i=1;i<13; i++) {
sizeLimitCombo->insertItem( QString::number( i * 5));
}
glayout3->addMultiCellWidget( sizeGroup, 0, 0, 1, 1);
dirGroup = new QGroupBox( tab_3, "dirGroup" );
dirGroup->setTitle( tr( "File Directory" ) );
dirGroup->setFixedSize( 130, 50);
directoryComboBox = new QComboBox( false, dirGroup, "dirGroup" );
directoryComboBox->setGeometry( QRect( 10, 15, 115, 25 ) );
glayout3->addMultiCellWidget( dirGroup, 1, 1, 0, 0);
bitGroup = new QGroupBox( tab_3, "bitGroup" );
bitGroup->setTitle( tr( "Bit Depth" ) );
bitGroup->setFixedSize( 65, 50);
bitRateComboBox = new QComboBox( false, bitGroup, "BitRateComboBox" );
z = 0;
while( deviceBitRates[z] != -1) {
bitRateComboBox->insertItem( s.setNum( deviceBitRates[z], 10) );
z++;
}
bitRateComboBox->setGeometry( QRect( 5, 20, 50, 25 ) );
glayout3->addMultiCellWidget( bitGroup, 1, 1, 1, 1);
compressionCheckBox = new QCheckBox ( tr("Wave Compression (smaller files)"), tab_3 );
autoMuteCheckBox = new QCheckBox ( tr("Auto Mute"), tab_3 );
stereoCheckBox = new QCheckBox ( tr("Stereo"), tab_3 );
glayout3->addMultiCellWidget( compressionCheckBox, 2, 2, 0, 3);
glayout3->addMultiCellWidget( autoMuteCheckBox, 3, 3, 0, 0);
glayout3->addMultiCellWidget( stereoCheckBox, 3, 3, 1, 1);
tab_5 = new QWidget( TabWidget, "tab_5" );
QHBoxLayout *Layout19a;
Layout19a = new QHBoxLayout( tab_5);
Layout19a->setSpacing( 2 );
Layout19a->setMargin( 0 );
Layout15 = new QVBoxLayout( this);
Layout15->setSpacing( 2 );
Layout15->setMargin( 0 );
Layout15b = new QVBoxLayout( this);
Layout15b->setSpacing( 2 );
Layout15b->setMargin( 0 );
TextLabel2 = new QLabel( tab_5, "InputLabel" );
TextLabel2->setText( tr( "In"));
TextLabel2->setFixedWidth( 35);
Layout15->addWidget( TextLabel2 );
TextLabel3 = new QLabel( tab_5, "OutputLabel" );
TextLabel3->setText( tr( "Out" ) );
Layout15b->addWidget( TextLabel3 );
InputSlider = new QSlider( -100, 0, 10, 0, QSlider::Vertical, tab_5, (const char *) "InputSlider" );
InputSlider->setTickmarks( QSlider::Both);
Layout15->addWidget( InputSlider);
OutputSlider = new QSlider( -100,0,10,0, QSlider::Vertical,tab_5,(const char *) "OutputSlider" );
OutputSlider->setTickmarks( QSlider::Both);
Layout15b->addWidget( OutputSlider );
outMuteCheckBox = new QCheckBox ( tr("mute"), tab_5 );
Layout15->addWidget( outMuteCheckBox );
inMuteCheckBox = new QCheckBox ( tr("mute"), tab_5 );
inMuteCheckBox-> setFocusPolicy ( QWidget::NoFocus );
Layout15b->addWidget( inMuteCheckBox );
Layout19a->addLayout( Layout15 );
Layout19a->addLayout( Layout15b );
fillDirectoryCombo();
TabWidget->insertTab( tab_3, tr( "Options" ) );
TabWidget->insertTab( tab_5, tr( "Volume" ) );
-
waveform = new Waveform( this, "waveform" );
-// waveform->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)5, (QSizePolicy::SizeType)3, waveform->sizePolicy().hasHeightForWidth() ) );
waveform->setMinimumSize( QSize( 0, 50 ) );
layout->addMultiCellWidget( waveform, 8, 8, 0, 8);
waveform->setBackgroundColor ( black );
}
void QtRec::initIconView() {
- owarn << "initIconView" << oendl;
ListView1->clear();
Config cfg("OpieRec");
cfg.setGroup("Sounds");
QString temp;
QPixmap image0( ( const char** ) image0_data );
int nFiles = cfg.readNumEntry("NumberofFiles",0);
- owarn << "init number of files " << nFiles << "" << oendl;
+// owarn << "init number of files " << nFiles << "" << oendl;
for(int i = 1; i <= nFiles; i++) {
QListViewItem * item;
QString fileS, mediaLocation, fileDate, filePath;
temp.sprintf( "%d",i);
temp = cfg.readEntry( temp,""); //reads currentFile
filePath = cfg.readEntry( temp,""); //currentFileName
QFileInfo info(filePath);
fileDate = info.lastModified().toString();
fileS = cfg.readEntry( filePath, "0" );// file length in seconds
mediaLocation = getStorage( filePath);
if( info.exists()) {
- owarn << "new item " << temp << oendl;
+// owarn << "new item " << temp << oendl;
item = new QListViewItem( ListView1, temp, fileS /*, mediaLocation, fileDate*/);
item->setPixmap( 0, image0);
if( currentFileName == filePath)
ListView1->setSelected( item, true);
}
}
}
void QtRec::initConnections() {
connect(qApp,SIGNAL(aboutToQuit()),SLOT(cleanUp()));
connect(toBeginningButton,SIGNAL(pressed()),this,SLOT(rewindPressed()));
connect(toBeginningButton,SIGNAL(released()),this,SLOT(rewindReleased()));
connect(toEndButton,SIGNAL(pressed()),this,SLOT(FastforwardPressed()));
connect(toEndButton,SIGNAL(released()),this,SLOT(FastforwardReleased()));
connect(deleteSoundButton,SIGNAL(released()),this,SLOT(deleteSound()));
connect(Stop_PushButton,SIGNAL(released()),this,SLOT(doPlayBtn()));
connect(Rec_PushButton,SIGNAL(released()),this,SLOT(newSound()));
connect(TabWidget,SIGNAL(currentChanged(QWidget*)),this,SLOT(thisTab(QWidget*)));
connect(OutputSlider,SIGNAL(sliderReleased()),this,SLOT(changedOutVolume()));
connect(InputSlider,SIGNAL(sliderReleased()),this,SLOT(changedInVolume()));
connect(sampleRateComboBox,SIGNAL(activated(int)),this,SLOT(changesamplerateCombo(int)));
connect(bitRateComboBox,SIGNAL(activated(int)),this,SLOT(changebitrateCombo(int)));
connect(directoryComboBox,SIGNAL(activated(int)),this,SLOT(changeDirCombo(int)));
connect(sizeLimitCombo,SIGNAL(activated(int)),this,SLOT(changeSizeLimitCombo(int)));
connect(stereoCheckBox,SIGNAL(toggled(bool)),this,SLOT(changeStereoCheck(bool)));
connect(outMuteCheckBox,SIGNAL(toggled(bool)),this,SLOT(doVolMuting(bool)));
connect(inMuteCheckBox,SIGNAL(toggled(bool)),this,SLOT(doMicMuting(bool)));
connect(ListView1,SIGNAL(doubleClicked(QListViewItem*)),this,SLOT(itClick(QListViewItem*)));
connect(ListView1,SIGNAL(mouseButtonPressed(int,QListViewItem*,const QPoint&,int)),this,SLOT(listPressed(int,QListViewItem*,const QPoint&,int)));
connect(timeSlider,SIGNAL(sliderMoved(int)),this,SLOT(changeTimeSlider(int)));
connect(timeSlider,SIGNAL(sliderPressed()),this,SLOT(timeSliderPressed()));
connect(timeSlider,SIGNAL(sliderReleased()),this,SLOT(timeSliderReleased()));
connect(compressionCheckBox,SIGNAL(toggled(bool)),this,SLOT(compressionSelected(bool)));
connect(autoMuteCheckBox,SIGNAL(toggled(bool)),this,SLOT(slotAutoMute(bool)));
}
void QtRec::initConfig() {
int index, fred, i;
Config cfg("OpieRec");
cfg.setGroup("Settings");
index = cfg.readNumEntry("samplerate",22050);
bool ok;
for(int ws=0;ws<sampleRateComboBox->count();ws++) {
fred = sampleRateComboBox->text(ws).toInt(&ok, 10);
if( index == fred) {
filePara.sampleRate = fred;
sampleRateComboBox->setCurrentItem(ws);
}
}
i = cfg.readNumEntry("bitrate",16);
if(i == 16)
bitRateComboBox->setCurrentItem( 1);
else if(i == 24)
bitRateComboBox->setCurrentItem( 2);
else if(i == 32)
bitRateComboBox->setCurrentItem( 3);
else
bitRateComboBox->setCurrentItem( 0);
filePara.resolution = i;
i = cfg.readNumEntry("sizeLimit", 5 );
QString temp;
sizeLimitCombo->setCurrentItem((i/5));
stereoCheckBox->setChecked( cfg.readBoolEntry("stereo", 1));
if( stereoCheckBox->isChecked()) {
filePara.channels = 2;
} else {
filePara.channels = 1;
}
compressionCheckBox->setChecked( cfg.readBoolEntry("wavCompression",1));
if( compressionCheckBox->isChecked()) {
bitRateComboBox->setEnabled(false);
bitRateComboBox->setCurrentItem(0);
filePara.resolution=16;
}
autoMuteCheckBox->setChecked( cfg.readBoolEntry("useAutoMute",0));
if( autoMuteCheckBox->isChecked())
slotAutoMute(true);
else
slotAutoMute(false);
Config cofg( "qpe");
cofg.setGroup( "Volume");
outMuteCheckBox->setChecked( cofg.readBoolEntry( "Mute",0));
inMuteCheckBox->setChecked( cofg.readBoolEntry( "MicMute",0));
}
void QtRec::stop() {
- owarn << "STOP" << oendl;
+// owarn << "STOP" << oendl;
setRecordButton(false);
if( !recording)
endPlaying();
else
endRecording();
timeSlider->setValue(0);
}
void QtRec::doPlayBtn() {
if(!stopped) {
// playLabel2->setText(tr("Play"));
stop();
} else {
if(ListView1->currentItem() == 0) return;
// playLabel2->setText(tr("Stop"));
currentFile = ListView1->currentItem()->text(0);
start();
}
}
void QtRec::start() { //play
if( stopped) {
QPixmap image3( ( const char** ) image3_data );
Stop_PushButton->setPixmap( image3 );
Stop_PushButton->setDown( true);
stopped = false;
paused = false;
secCount = 1;
if( openPlayFile())
if( setupAudio( false)) //recording is false
doPlay();
}
}
bool QtRec::rec() { //record
QString timeString;
timeString.sprintf("%.0f", 0.0);
// timeLabel->setText( timeString+ " seconds");
if(!stopped) {
monitoring = true;
return false;
} else {
secCount = 1;
// playLabel2->setText(tr("Stop"));
monitoring = false;
setRecordButton( true);
if( setupAudio( true))
if(setUpFile()) {
int fileSize = 0;
Config cfg("OpieRec");
cfg.setGroup("Settings");
// odebug << "<<<<<<<Device bits " << soundDevice->getDeviceBits()
// << ", device rate " << soundDevice->getDeviceRate()
// << ", device channels " << soundDevice->getDeviceChannels() << oendl;
//filePara.sampleRate = cfg.readNumEntry("samplerate", 22050);
// odebug << "sample rate is " << filePara.sampleRate << "" << oendl;
filePara.SecondsToRecord = getCurrentSizeLimit();
// odebug << "size limit " << filePara.SecondsToRecord << " sec" << oendl;
int diskSize = checkDiskSpace( (const QString &) wavFile->trackName());
if( filePara.SecondsToRecord == 0) {
fileSize = diskSize;
} else if( filePara.format == WAVE_FORMAT_PCM) {
// odebug << "WAVE_FORMAT_PCM" << oendl;
fileSize = (filePara.SecondsToRecord ) * filePara.channels
* filePara.sampleRate * ( filePara.resolution / 8) + 1000;
} else {
// odebug << "WAVE_FORMAT_DVI_ADPCM" << oendl;
fileSize = ((filePara.SecondsToRecord) * filePara.channels
* filePara.sampleRate * ( filePara.resolution / 8) ) / 4 + 250;
}
filePara.samplesToRecord = fileSize;
odebug << "filesize should be " << filePara.samplesToRecord
<< ", bits " << filePara.resolution << ", rate " << filePara.sampleRate;
if( paused) {
paused = false;
}
// else {
odebug << "Setting timeslider " << filePara.samplesToRecord << "" << oendl;
// if(fileSize != 0)
timeSlider->setRange(0, filePara.samplesToRecord);
// }
if( diskSize < fileSize/1024) {
QMessageBox::warning(this,
tr("Low Disk Space"),
tr("You are running low of\nrecording space\n"
"or a card isn't being recognized"));
stopped = true; //we need to be stopped
stop();
} else {
QString msg;
msg.sprintf("%d, %d, %d", filePara.sampleRate, filePara.channels, filePara.resolution);
#ifdef DEV_VERSION
setCaption( msg);
#endif
filePara.fileName=currentFile.latin1();
odebug << "Start recording" << oendl;
stopped = false;
#ifdef THREADED
odebug << "Start recording thread" << oendl;
pthread_t thread1;
pthread_create( &thread1, NULL, (void * (*)(void *))quickRec, NULL/* &*/);
#endif
toBeginningButton->setEnabled( false);
toEndButton->setEnabled( false);
startTimer(1000);
#ifndef THREADED
quickRec();
#endif
}
} //end setUpFile
} //end setupAudio
return true;
}
/*
This happens when a tab is selected*/
void QtRec::thisTab(QWidget* widg) {
if(widg != NULL) {
int index = TabWidget->currentPageIndex();
if(index == 0) { //file page
}
if(index == 1) { //control page
fillDirectoryCombo();
// soundDevice->getOutVol();
// soundDevice->getInVol();
}
if( index==2) { //help page
}
qApp->processEvents();
update();
}
}
void QtRec::getOutVol( ) {
filePara.outVol = soundDevice->getOutVolume();
// odebug << "out vol " << filePara.outVol << "" << oendl;
OutputSlider->setValue( -filePara.outVol);
}
void QtRec::getInVol() {
filePara.inVol = soundDevice->getInVolume();
// odebug << "in vol " << filePara.inVol << "" << oendl;
InputSlider->setValue( -filePara.inVol);
}
void QtRec::changedOutVolume() {
soundDevice->changedOutVolume( -OutputSlider->value());
}
void QtRec::changedInVolume( ) {
soundDevice->changedInVolume( -InputSlider->value());
}
bool QtRec::setupAudio( bool b) {
bool ok;
int sampleformat, stereo, flags;
QString dspString, mixerString;
filePara.resolution = bitRateComboBox->currentText().toInt( &ok,10); //16
if( !b) {
// we want to play
#ifdef PDAUDIO //ALSA
if( filePara.resolution == 16 || compressionCheckBox->isChecked() ) {
sampleformat = SND_PCM_FORMAT_S16;
filePara.resolution = 16;
} else if( filePara.resolution == 24 || compressionCheckBox->isChecked() ) {
sampleformat = SND_PCM_FORMAT_S24;
filePara.resolution = 24;
} else if( filePara.resolution == 32 || compressionCheckBox->isChecked() ) {
sampleformat = SND_PCM_FORMAT_S32;
filePara.resolution = 32;
} else {
sampleformat = SND_PCM_FORMAT_U8;
filePara.resolution = 8;
}
#else
// we want to play
if( filePara.resolution == 16 || compressionCheckBox->isChecked() ) {
sampleformat = AFMT_S16_LE;
filePara.resolution = 16;
} else {
sampleformat = AFMT_U8;
filePara.resolution = 8;
}
#endif
stereo = filePara.channels;
flags = O_WRONLY;
- Config hwcfg("OpieRec");
- hwcfg.setGroup("Hardware");
- dspString = hwcfg.readEntry( "Audio", DSPSTROUT);
- mixerString = hwcfg.readEntry( "Mixer", DSPSTRMIXEROUT);
recording = false;
} else { // we want to record
#ifdef PDAUDIO //ALSA
if( !bitRateComboBox->isEnabled() || bitRateComboBox->currentText() == "16")
sampleformat = SND_PCM_FORMAT_S16;
else if( !bitRateComboBox->isEnabled() || bitRateComboBox->currentText() == "24")
sampleformat = SND_PCM_FORMAT_S24;
else if( !bitRateComboBox->isEnabled() || bitRateComboBox->currentText() == "32")
sampleformat = SND_PCM_FORMAT_S32;
else
sampleformat = SND_PCM_FORMAT_U8;
#else
if( !bitRateComboBox->isEnabled() || bitRateComboBox->currentText() == "16")
sampleformat = AFMT_S16_LE;
else
sampleformat = AFMT_U8;
if( !compressionCheckBox->isChecked()) {
filePara.format = WAVE_FORMAT_PCM;
// odebug << "WAVE_FORMAT_PCM" << oendl;
} else {
filePara.format = WAVE_FORMAT_DVI_ADPCM;
sampleformat = AFMT_S16_LE;
// odebug << "WAVE_FORMAT_DVI_ADPCM" << oendl;
}
#endif
stereo = filePara.channels;
// filePara.sampleRate = sampleRateComboBox->currentText().toInt( &ok,10);//44100;
flags= O_RDWR;
// flags= O_RDONLY;
- Config hwcfg("OpieRec");
- hwcfg.setGroup("Hardware");
- dspString = hwcfg.readEntry( "Audio", DSPSTRIN);
- mixerString = hwcfg.readEntry( "Mixer", DSPSTRMIXERIN);
recording = true;
}
// if(soundDevice) delete soundDevice;
odebug << "<<<<<<<<<<<<<<<<<<<open dsp " << filePara.sampleRate << " " << filePara.channels << " " << sampleformat << "" << oendl;
- owarn << "change waveform settings" << oendl;
+// owarn << "change waveform settings" << oendl;
waveform->changeSettings( filePara.sampleRate, filePara.channels );
- soundDevice = new Device( this, dspString, mixerString, b);
+ soundDevice = new Device( this, b); //open rec
// soundDevice->openDsp();
soundDevice->reset();
odebug << "device has been made " << soundDevice->sd << "" << oendl;
////////////////// <<<<<<<<<<<<>>>>>>>>>>>>
soundDevice->setDeviceFormat( sampleformat);
soundDevice->setDeviceChannels( filePara.channels);
soundDevice->setDeviceRate( filePara.sampleRate);
soundDevice->getDeviceFragSize();
#ifdef QT_QWS_EBX
int frag = FRAGSIZE;
soundDevice->setFragSize( frag);
soundDevice->getDeviceFragSize();
#endif
/////////////////
filePara.sd = soundDevice->sd;
if ( filePara.sd == -1) {
monitoring = false;
stopped = true;
update();
setCaption( tr( "OpieRecord " )+ QString::number(VERSION) );
return false;
}
if(autoMute)
doMute(false);
return true;
}
bool QtRec::setUpFile() { //setup file for recording
// odebug << "Setting up wavfile" << oendl;
// if(wavFile) delete wavFile;
wavFile = new WavFile( this, (const QString &)"",
true,
filePara.sampleRate,
filePara.channels,
filePara.resolution,
filePara.format);
filePara.fd = wavFile->wavHandle();
if(filePara.fd == -1) {
return false;
} else {
// filePara.channels=1;
}
return true;
}
/// <<<<<<<<<<<<<<<< PLAY >>>>>>>>>>>>>>>>>>>
bool QtRec::doPlay() {
if( !paused) {
total = 0;
filePara.numberOfRecordedSeconds = 0;
} else {
paused = false;
secCount = (int)filePara.numberOfRecordedSeconds;
}
playing = true;
stopped = false;
recording = false;
QString num;
odebug << "Play number of samples " << filePara.numberSamples << "" << oendl;
// timeSlider->setRange( 0, filePara.numberSamples);
timeString.sprintf("%f", filePara.numberOfRecordedSeconds);
// timeLabel->setText( timeString+ tr(" seconds"));
QString msg;
msg.sprintf("%d, %d, %d",
filePara.sampleRate,
filePara.channels,
filePara.resolution);
#ifdef DEV_VERSION
setCaption( msg);
#endif
startTimer( 1000);
#ifdef THREADED
pthread_t thread2;
pthread_create( &thread2, NULL, (void * (*)(void *))playIt, NULL/* &*/);
#endif
toBeginningButton->setEnabled( false);
toEndButton->setEnabled( false);
#ifndef THREADED
playIt();
#endif
return true;
}
void QtRec::changebitrateCombo(int i) {
Config cfg("OpieRec");
cfg.setGroup("Settings");
int bits = 0;
if( i == 1) { bits = 16; }
else if( i == 2) { bits = 24; }
else if( i == 3) { bits = 32; }
else { bits=8; }
cfg.writeEntry("bitrate", bits);
filePara.resolution = bits;
cfg.write();
}
void QtRec::changesamplerateCombo(int i) {
Config cfg("OpieRec");
cfg.setGroup("Settings");
int rate=0;
bool ok;
rate = sampleRateComboBox->text(i).toInt(&ok, 10);
cfg.writeEntry( "samplerate",rate);
filePara.sampleRate=rate;
odebug << "Change sample rate " << rate << "" << oendl;
cfg.write();
}
void QtRec::changeDirCombo(int index) {
Config cfg("OpieRec");
cfg.setGroup("Settings");
QString sName = directoryComboBox->text(index);
StorageInfo storageInfo;
const QList<FileSystem> &fs = storageInfo.fileSystems();
QListIterator<FileSystem> it ( fs );
QString storage;
for( ; it.current(); ++it ){
if( sName == (*it)->name()+" "+ (*it)->path() ||
(*it)->name() == sName ) {
const QString path = (*it)->path();
recDir = path;
cfg.writeEntry("directory", recDir);
odebug << "new rec dir "+recDir << oendl;
}
}
cfg.write();
}
void QtRec::changeSizeLimitCombo(int) {
Config cfg("OpieRec");
cfg.setGroup("Settings");
cfg.writeEntry("sizeLimit", getCurrentSizeLimit() );
cfg.write();
}
void QtRec::newSound() {
if( !rec()) {
endRecording();
deleteSound();
}
}
void QtRec::itClick(QListViewItem *item) {
currentFile = item->text(0);
setCaption("OpieRecord "+currentFile);
}
void QtRec::deleteSound() {
Config cfg("OpieRec");
cfg.setGroup("Sounds");
if( ListView1->currentItem() == NULL)
return;
-#ifndef DEV_VERSION
- switch ( QMessageBox::warning(this,tr("Delete"),
- tr("Do you really want to <font size=+2><B>DELETE</B></font>\nthe selected file?"),
- tr("Yes"),tr("No"),0,1,1) ) {
- case 0:
-#endif
- {
+// #ifndef DEV_VERSION
+// switch ( QMessageBox::warning(this,tr("Delete"),
+// tr("Do you really want to <font size=+2><B>DELETE</B></font>\nthe selected file?"),
+// tr("Yes"),tr("No"),0,1,1) ) {
+// case 0:
+// #endif
+ // {
QString file = ListView1->currentItem()->text(0);
QString fileName;
fileName = cfg.readEntry( file, "");
QFile f( fileName);
if( f.exists())
if( !f.remove())
QMessageBox::message( tr("Error"), tr("Could not remove file."));
int nFiles = cfg.readNumEntry( "NumberofFiles",0);
bool found = false;
for(int i=0;i<nFiles+1;i++) {
if( cfg.readEntry( QString::number(i),"").find( file,0,true) != -1) {
found = true;
cfg.writeEntry( QString::number(i), cfg.readEntry( QString::number(i+1),""));
}
if(found)
cfg.writeEntry( QString::number(i), cfg.readEntry( QString::number(i+1),""));
}
cfg.removeEntry( cfg.readEntry( file));
cfg.removeEntry( file);
cfg.writeEntry( "NumberofFiles", nFiles-1);
cfg.write();
ListView1->takeItem( ListView1->currentItem() );
delete ListView1->currentItem();
ListView1->clear();
ListView1->setSelected( ListView1->firstChild(), true);
initIconView();
update();
- }
-#ifndef DEV_VERSION
- };
-#endif
- setCaption( tr( "OpieRecord " ) + QString::number(VERSION) );
-
+ setCaption( tr( "OpieRecord " ));
}
void QtRec::keyPressEvent( QKeyEvent *e) {
switch ( e->key() ) {
// case Key_F1:
// if(stopped && !recording)
// newSound();
// else
// stop();
// break;
// case Key_F2: {
// if( !e->isAutoRepeat())
// rewindPressed();
// }
// break;
// case Key_F3: {
// if( !e->isAutoRepeat())
// FastforwardPressed();
// }
// break;
////////////////////////////// Zaurus keys
case Key_F9: //activity
break;
case Key_F10: //contacts
break;
case Key_F11: //menu
break;
case Key_F12: //home
break;
case Key_F13: //mail
break;
case Key_Space:
break;
case Key_Delete:
break;
case Key_Up:
// stop();
break;
case Key_Down:
// newSound();
break;
case Key_Left: {
odebug << "rewinding" << oendl;
if( !e->isAutoRepeat())
rewindPressed();
}
break;
case Key_Right: {
if( !e->isAutoRepeat())
FastforwardPressed();
}
break;
}
}
void QtRec::keyReleaseEvent( QKeyEvent *e) {
switch ( e->key() ) {
// case Key_F1:
// if(stopped && !recording)
// newSound();
// else
// stop();
// break;
// case Key_F2:
// rewindReleased();
// break;
// case Key_F3:
// FastforwardReleased();
// break;
////////////////////////////// Zaurus keys
case Key_F9: //activity
break;
case Key_F10: //contacts
break;
case Key_F11: //menu
break;
case Key_F12: //home
if(stopped)
doPlayBtn();
else
stop();
break;
case Key_F13: //mail
break;
case Key_Space:
if(stopped && !recording)
newSound();
else
stop();
break;
case Key_Delete:
deleteSound();
break;
case Key_Up:
// stop();
odebug << "Up" << oendl;
break;
case Key_Down:
// start();
// odebug << "Down" << oendl;
// newSound();
break;
case Key_Left:
odebug << "Left" << oendl;
rewindReleased();
break;
case Key_Right:
odebug << "Right" << oendl;
FastforwardReleased();
break;
}
}
void QtRec::endRecording() {
+
monitoring = false;
recording = false;
stopped = true;
waveform->reset();
setRecordButton( false);
toBeginningButton->setEnabled( true);
toEndButton->setEnabled( true);
killTimers();
if(autoMute)
doMute( true);
soundDevice->closeDevice( true);
if( wavFile->track.isOpen()) {
wavFile->adjustHeaders( filePara.fd, filePara.numberSamples);
// soundDevice->sd=-1;
filePara.numberSamples = 0;
// filePara.sd=-1;
wavFile->closeFile();
filePara.fd=0;
if( wavFile->isTempFile()) {
// move tmp file to regular file
QString cmd;
cmd.sprintf("mv "+ wavFile->trackName() + " " + wavFile->currentFileName);
odebug << "moving tmp file to "+currentFileName << oendl;
system( cmd.latin1());
}
odebug << "Just moved " + wavFile->currentFileName << oendl;
Config cfg("OpieRec");
cfg.setGroup("Sounds");
int nFiles = cfg.readNumEntry( "NumberofFiles",0);
currentFile = QFileInfo( wavFile->currentFileName).fileName();
currentFile = currentFile.left( currentFile.length() - 4);
cfg.writeEntry( "NumberofFiles", nFiles + 1);
cfg.writeEntry( QString::number( nFiles + 1), currentFile);
cfg.writeEntry( currentFile, wavFile->currentFileName);
QString time;
time.sprintf("%.2f", filePara.numberOfRecordedSeconds);
cfg.writeEntry( wavFile->currentFileName, time );
odebug << "writing config numberOfRecordedSeconds "+time << oendl;
cfg.write();
odebug << "finished recording" << oendl;
// timeLabel->setText("");
}
// if(soundDevice) delete soundDevice;
timeSlider->setValue(0);
initIconView();
selectItemByName( currentFile);
+ setCaption( tr( "OpieRecord " ));
+
}
void QtRec::endPlaying() {
monitoring = false;
recording = false;
playing = false;
stopped = true;
waveform->reset();
// errorStop();
odebug << "end playing" << oendl;
setRecordButton( false);
toBeginningButton->setEnabled( true);
toEndButton->setEnabled( true);
if(autoMute)
doMute( true);
soundDevice->closeDevice( false);
soundDevice->sd = -1;
// if(soundDevice) delete soundDevice;
odebug << "file and sound device closed" << oendl;
// timeLabel->setText("");
total = 0;
filePara.numberSamples = 0;
filePara.sd = -1;
// wavFile->closeFile();
filePara.fd = 0;
// if(wavFile) delete wavFile; //this crashes
odebug << "track closed" << oendl;
killTimers();
- owarn << "reset slider" << oendl;
+// owarn << "reset slider" << oendl;
timeSlider->setValue(0);
// if(soundDevice) delete soundDevice;
}
bool QtRec::openPlayFile() {
qApp->processEvents();
if( currentFile.isEmpty()) {
QMessageBox::message(tr("Opierec"),tr("Please select file to play"));
endPlaying();
return false;
}
QString currentFileName;
Config cfg("OpieRec");
cfg.setGroup("Sounds");
int nFiles = cfg.readNumEntry( "NumberofFiles", 0);
for(int i=0;i<nFiles+1;i++) { //look for file
if( cfg.readEntry( QString::number(i),"").find( currentFile,0,true) != -1) {
currentFileName = cfg.readEntry( currentFile, "" );
odebug << "opening for play: " + currentFileName << oendl;
}
}
wavFile = new WavFile(this,
currentFileName,
false);
filePara.fd = wavFile->wavHandle();
if(filePara.fd == -1) {
// if(!track.open(IO_ReadOnly)) {
QString errorMsg = (QString)strerror(errno);
monitoring = false;
- setCaption( tr( "OpieRecord " ) + QString::number(VERSION) );
+ setCaption( tr( "OpieRecord " ));
QMessageBox::message(tr("Note"), tr("Could not open audio file.\n")
+ errorMsg + "\n" + currentFile);
return false;
} else {
filePara.numberSamples = wavFile->getNumberSamples();
filePara.format = wavFile->getFormat();
filePara.sampleRate = wavFile->getSampleRate();
filePara.resolution = wavFile->getResolution();
filePara.channels = wavFile->getChannels();
timeSlider->setPageStep(1);
monitoring = true;
odebug << "file " << filePara.fd << ", samples " << filePara.numberSamples << " " << filePara.sampleRate << "" << oendl;
int sec = (int) (( filePara.numberSamples / filePara.sampleRate) / filePara.channels) / ( filePara.channels*( filePara.resolution/8));
- owarn << "seconds " << sec << "" << oendl;
+// owarn << "seconds " << sec << "" << oendl;
timeSlider->setRange(0, filePara.numberSamples );
}
return true;
}
void QtRec::listPressed( int mouse, QListViewItem *item, const QPoint &, int ) {
if(item == NULL )
return;
switch (mouse) {
case 1: {
if( renameBox != 0 ) //tricky
cancelRename();
currentFile = item->text(0);
- setCaption( "OpieRecord " + currentFile);
+// setCaption( "OpieRecord " + currentFile);
}
break;
case 2:
showListMenu(item);
ListView1->clearSelection();
break;
};
}
void QtRec::showListMenu(QListViewItem * item) {
if(item == NULL)
return;
QPopupMenu *m = new QPopupMenu(this);
m->insertItem( tr("Play"), this, SLOT( doMenuPlay() ));
if(Ir::supported()) m->insertItem( tr( "Send with Ir" ), this, SLOT( doBeam() ));
m->insertItem( tr( "Rename" ), this, SLOT( doRename() ));
// #if defined (QTOPIA_INTERNAL_FSLP)
// m->insertItem( tr( "Properties" ), this, SLOT( doProperties() ));
// #endif
m->insertSeparator();
m->insertItem( tr("Delete"), this, SLOT( deleteSound() ) );
m->exec( QCursor::pos() );
qApp->processEvents();
}
void QtRec::fileBeamFinished( Ir *ir) {
if(ir)
QMessageBox::message( tr("Ir Beam out"), tr("Ir sent.") ,tr("Ok") );
}
void QtRec::doBeam() {
qApp->processEvents();
if( ListView1->currentItem() == NULL)
return;
Ir ir;
if( ir.supported()) {
QString file = ListView1->currentItem()->text(0);
Config cfg("OpieRec");
cfg.setGroup("Sounds");
int nFiles = cfg.readNumEntry("NumberofFiles",0);
for(int i=0;i<nFiles+1;i++) {
if( cfg.readEntry( QString::number( i),"").find( file, 0, true) != -1) {
QString filePath = cfg.readEntry(file,"");
Ir *file = new Ir(this, "IR");
connect( file, SIGNAL( done(Ir*)),
this, SLOT( fileBeamFinished(Ir*)));
file->send( filePath, "OPieRec audio file\n" + filePath );
}
}
}
}
void QtRec::doMenuPlay() {
qApp->processEvents();
currentFile = ListView1->currentItem()->text(0);
}
void QtRec::doRename() {
QRect r = ListView1->itemRect( ListView1->currentItem( ));
r = QRect( ListView1->viewportToContents( r.topLeft() ), r.size() );
r.setX( ListView1->contentsX() );
if ( r.width() > ListView1->visibleWidth() )
r.setWidth( ListView1->visibleWidth() );
renameBox = new QLineEdit( ListView1->viewport(), "qt_renamebox" );
renameBox->setFrame(true);
renameBox->setText( ListView1->currentItem()->text(0) );
renameBox->selectAll();
renameBox->installEventFilter( this );
ListView1->addChild( renameBox, r.x(), r.y() );
renameBox->resize( r.size() );
ListView1->viewport()->setFocusProxy( renameBox );
renameBox->setFocus();
renameBox->show();
}
void QtRec::okRename() {
odebug << renameBox->text() << oendl;
QString filename = renameBox->text();
cancelRename();
if( ListView1->currentItem() == NULL)
return;
Config cfg("OpieRec");
cfg.setGroup("Sounds");
QString file = ListView1->currentItem()->text(0);
odebug << "filename is " + filename << oendl;
int nFiles = cfg.readNumEntry("NumberofFiles",0);
for(int i=0;i<nFiles+1;i++) { //look for file
if( cfg.readEntry( QString::number(i),"").find(file,0,true) != -1) {
QString filePath = cfg.readEntry(file,"");
cfg.writeEntry( QString::number(i), filename );
cfg.writeEntry( filename, filePath );
cfg.removeEntry( file);
cfg.write();
}
}
ListView1->takeItem( ListView1->currentItem() );
delete ListView1->currentItem();
ListView1->clear();
initIconView();
update();
}
void QtRec::cancelRename() {
bool resetFocus = ListView1->viewport()->focusProxy() == renameBox;
delete renameBox;
renameBox = 0;
if ( resetFocus ) {
ListView1->viewport()->setFocusProxy( ListView1 );
ListView1->setFocus();
}
}
bool QtRec::eventFilter( QObject * o, QEvent * e ) {
if ( o->inherits( "QLineEdit" ) ) {
if ( e->type() == QEvent::KeyPress ) {
QKeyEvent *ke = (QKeyEvent*)e;
if ( ke->key() == Key_Return ||
ke->key() == Key_Enter ) {
okRename();
return true;
} else if ( ke->key() == Key_Escape ) {
cancelRename();
return true;
}
} else if ( e->type() == QEvent::FocusOut ) {
cancelRename();
return true;
}
}
return QWidget::eventFilter( o, e );
}
int QtRec::getCurrentSizeLimit() {
return sizeLimitCombo->currentItem() * 5;
}
void QtRec::timerBreak() {
endPlaying();
}
void QtRec::doVolMuting(bool b) {
Config cfg( "qpe" );
cfg. setGroup( "Volume" );
cfg.writeEntry( "Mute",b);
cfg.write();
QCopEnvelope( "QPE/System", "volumeChange(bool)" ) << b;
}
void QtRec::doMicMuting(bool b) {
// odebug << "mic mute" << oendl;
Config cfg( "qpe" );
cfg. setGroup( "Volume" );
cfg.writeEntry( "MicMute",b);
cfg.write();
QCopEnvelope( "QPE/System", "micChange(bool)" ) << b;
}
void QtRec::compressionSelected(bool b) {
Config cfg("OpieRec");
cfg.setGroup("Settings");
cfg.writeEntry("wavCompression", b);
cfg.writeEntry("bitrate", 16);
filePara.resolution = 16;
cfg.write();
if(b) {
bitRateComboBox->setEnabled( false);
bitRateComboBox->setCurrentItem( 1);
filePara.resolution = 16;
} else{
bitRateComboBox->setEnabled( true);
}
}
long QtRec::checkDiskSpace(const QString &path) {
struct statfs fs;
if ( !statfs( path.latin1(), &fs ) ) {
int blkSize = fs.f_bsize;
int availBlks = fs.f_bavail;
long mult = blkSize / 1024;
long div = 1024 / blkSize;
if ( !mult ) mult = 1;
if ( !div ) div = 1;
return availBlks * mult / div;
}
return -1;
}
// short f_fstyp; /* File system type */
// long f_bsize; /* Block size */
// long f_frsize; /* Fragment size */
// long f_blocks; /* Total number of blocks*/
// long f_bfree; /* Count of free blocks */
// long f_files; /* Total number of file nodes */
// long f_ffree; /* Count of free file nodes */
// char f_fname[6]; /* Volumename */
// char f_fpack[6]; /* Pack name */
void QtRec::receive( const QCString &msg, const QByteArray & ) {
odebug << "Voicerecord received message "+msg << oendl;
}
///////////////////////////// timerEvent
void QtRec::timerEvent( QTimerEvent * ) {
// if(!recording)
// timeSlider->setValue( secCount);
// else
// timeSlider->setValue( filePara.numberOfRecordedSeconds);
if( stopped && playing) {
stop();
}
if( stopped && recording ){
stop();
}
if( recording && filePara.SecondsToRecord < secCount && filePara.SecondsToRecord != 0) {
stop();
}
odebug << "" << secCount << "" << oendl;
QString timeString;
-#ifdef DEV_VERSION
- QString msg;
- msg.sprintf("%d, %d, %d", filePara.sampleRate, filePara.channels, filePara.resolution);
- setCaption( msg +" :: "+QString::number(secCount));
-#endif
timeString.sprintf("%d", secCount);
// timeLabel->setText( timeString + " seconds");
secCount++;
}
void QtRec::changeTimeSlider(int index) {
if( ListView1->currentItem() == 0 || !wavFile->track.isOpen()) return;
odebug << "Slider moved to " << index << "" << oendl;
paused = true;
stopped = true;
sliderPos=index;
QString timeString;
filePara.numberOfRecordedSeconds = (float)sliderPos / (float)filePara.sampleRate * (float)2;
timeString.sprintf( "%.2f", filePara.numberOfRecordedSeconds);
secCount = (int)filePara.numberOfRecordedSeconds;
// timeLabel->setText( timeString + tr(" seconds"));
}
void QtRec::timeSliderPressed() {
if( ListView1->currentItem() == 0) return;
odebug << "slider pressed" << oendl;
paused = true;
stopped = true;
}
void QtRec::timeSliderReleased() {
if( ListView1->currentItem() == 0) return;
sliderPos = timeSlider->value();
odebug << "slider released " << sliderPos << "" << oendl;
stopped = false;
int newPos = lseek( filePara.fd, sliderPos, SEEK_SET);
total = newPos*4;
filePara.numberOfRecordedSeconds = (float)sliderPos / (float)filePara.sampleRate * (float)2;
doPlay();
}
void QtRec::rewindPressed() {
if( ListView1->currentItem() == 0) return;
if( !wavFile->track.isOpen()) {
if( !openPlayFile() )
return;
else
if( !setupAudio( false))
return;
} else {
killTimers();
paused = true;
stopped = true;
rewindTimer->start( 50, false);
}
}
void QtRec::rewindTimerTimeout() {
int sliderValue = timeSlider->value();
sliderValue = sliderValue - ( filePara.numberSamples / 100);
// if(toBeginningButton->isDown())
timeSlider->setValue( sliderValue ) ;
odebug << "" << sliderValue << "" << oendl;
QString timeString;
filePara.numberOfRecordedSeconds = (float)sliderValue / (float)filePara.sampleRate * (float)2;
timeString.sprintf( "%.2f", filePara.numberOfRecordedSeconds);
// timeLabel->setText( timeString+ tr(" seconds"));
}
void QtRec::rewindReleased() {
rewindTimer->stop();
if( wavFile->track.isOpen()) {
sliderPos=timeSlider->value();
stopped = false;
int newPos = lseek( filePara.fd, sliderPos, SEEK_SET);
total = newPos * 4;
odebug << "rewind released " << total << "" << oendl;
startTimer( 1000);
doPlay();
}
}
void QtRec::FastforwardPressed() {
if( ListView1->currentItem() == 0) return;
if( !wavFile->track.isOpen())
if( !openPlayFile() )
return;
else
if( !setupAudio( false))
return;
killTimers();
paused = true;
stopped = true;
forwardTimer->start(50, false);
}
void QtRec::forwardTimerTimeout() {
int sliderValue = timeSlider->value();
sliderValue = sliderValue + ( filePara.numberSamples / 100);
// if(toEndButton->isDown())
timeSlider->setValue( sliderValue);
QString timeString;
filePara.numberOfRecordedSeconds = (float)sliderValue / (float)filePara.sampleRate * (float)2;
timeString.sprintf( "%.2f", filePara.numberOfRecordedSeconds);
// timeLabel->setText( timeString+ tr(" seconds"));
}
void QtRec::FastforwardReleased() {
forwardTimer->stop();
if( wavFile->track.isOpen()) {
sliderPos=timeSlider->value();
stopped = false;
int newPos = lseek( filePara.fd, sliderPos, SEEK_SET);
total = newPos * 4;
filePara.numberOfRecordedSeconds = (float)sliderPos / (float)filePara.sampleRate * (float)2;
startTimer( 1000);
doPlay();
}
}
QString QtRec::getStorage(const QString &fileName) {
StorageInfo storageInfo;
const QList<FileSystem> &fs = storageInfo.fileSystems();
QListIterator<FileSystem> it ( fs );
QString storage;
for( ; it.current(); ++it ){
const QString name = ( *it)->name();
const QString path = ( *it)->path();
const QString disk = ( *it)->disk();
if( fileName.find( path,0,true) != -1)
storage = name;
// const QString options = (*it)->options();
// if( name.find( tr("Internal"),0,true) == -1) {
// storageComboBox->insertItem( name +" -> "+disk);
// odebug << name << oendl;
}
return storage;
// struct mntent *me;
// // if(fileName == "/etc/mtab") {
// FILE *mntfp = setmntent( fileName.latin1(), "r" );
// if ( mntfp ) {
// while ( (me = getmntent( mntfp )) != 0 ) {
// QString filesystemType = me->mnt_type;
// }
// }
// endmntent( mntfp );
}
void QtRec::setRecordButton(bool b) {
if(b) { //about to record or play
Rec_PushButton->setDown( true);
QPixmap image3( ( const char** ) image3_data );
Stop_PushButton->setPixmap( image3 );
if(Stop_PushButton->isDown())
Stop_PushButton->setDown( true);
// playLabel2->setText( tr("Stop") );
} else { //about to stop
QPixmap image4( ( const char** ) image4_data );
Stop_PushButton->setPixmap( image4);
if(Stop_PushButton->isDown())
Stop_PushButton->setDown( false);
// playLabel2->setText( tr("Play") );
if(Rec_PushButton->isDown())
Rec_PushButton->setDown( false);
}
}
void QtRec::fillDirectoryCombo() {
if( directoryComboBox->count() > 0)
directoryComboBox->clear();
int index = 0;
Config cfg("OpieRec");
cfg.setGroup("Settings");
QString dir = cfg.readEntry("directory", "/");
StorageInfo storageInfo;
const QList<FileSystem> &fs = storageInfo.fileSystems();
QListIterator<FileSystem> it ( fs );
QString storage;
for( ; it.current(); ++it ){
const QString name = ( *it)->name();
const QString path = ( *it)->path();
// directoryComboBox->insertItem(name+" "+path);
directoryComboBox->insertItem(name);
if( path == dir)
directoryComboBox->setCurrentItem( index);
index++;
}
}
void QtRec::errorStop() {
stopped = true;
wavFile->closeFile();
killTimers();
}
void QtRec::doMute(bool b) {
doVolMuting( b);
doMicMuting( b);
}
void QtRec::slotAutoMute(bool b) {
autoMute = b;
Config cfg("OpieRec");
cfg.setGroup("Settings");
cfg.writeEntry("useAutoMute",b);
doMute( b);
outMuteCheckBox->setChecked( b);
inMuteCheckBox->setChecked( b);
}
void QtRec::selectItemByName(const QString & name) {
QListViewItemIterator it( ListView1 );
for ( ; it.current(); ++it )
if( name == it.current()->text(0))
ListView1->setCurrentItem(it.current());
}
// long findPeak(long input ) {
// // halfLife = time in seconds for output to decay to half value after an impulse
// static float output = 0.0;
// float halfLife = .0025;
// float vsf = .0025;
// float scalar = pow( 0.5, 1.0/(halfLife * filePara.sampleRate ));
// if( input < 0.0 )
// input = -input; // Absolute value.
// if ( input >= output ) {
// // When we hit a peak, ride the peak to the top.
// output = input;
// } else {
// // Exponential decay of output when signal is low.
// output = output * scalar;
// //
// // When current gets close to 0.0, set current to 0.0 to prevent FP underflow
// // which can cause a severe performance degradation due to a flood
// // of interrupts.
// //
// if( output < vsf ) output = 0.0;
// }
// return (long) output;
// }
diff --git a/noncore/multimedia/opierec/waveform.cpp b/noncore/multimedia/opierec/waveform.cpp
index 7c9a25f..d1838e1 100644
--- a/noncore/multimedia/opierec/waveform.cpp
+++ b/noncore/multimedia/opierec/waveform.cpp
@@ -1,163 +1,163 @@
/**********************************************************************
** 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"
/* OPIE */
#include <opie2/odebug.h>
using namespace Opie::Core;
/* QT */
#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();
// owarn << "change waveform " << frequency << ", " << channels << "" << oendl;
samplesPerPixel = frequency * channels / (5 * windowSize);
- owarn << "Waveform::changeSettings " << samplesPerPixel << "" << oendl;
+// owarn << "Waveform::changeSettings " << samplesPerPixel << "" << oendl;
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.
//owarn << "" << currentValue << ", " << numSamples << ", " << windowPosn << "" << oendl;
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();
}