-rw-r--r-- | noncore/multimedia/opierec/device.cpp | 59 | ||||
-rw-r--r-- | noncore/multimedia/opierec/device.h | 59 | ||||
-rw-r--r-- | noncore/multimedia/opierec/main.cpp | 5 | ||||
-rw-r--r-- | noncore/multimedia/opierec/opierec.control | 2 | ||||
-rw-r--r-- | noncore/multimedia/opierec/opierec.pro | 25 | ||||
-rw-r--r-- | noncore/multimedia/opierec/qtrec.cpp | 1409 | ||||
-rw-r--r-- | noncore/multimedia/opierec/qtrec.h | 15 | ||||
-rw-r--r-- | noncore/multimedia/opierec/wavFile.cpp | 17 | ||||
-rw-r--r-- | noncore/multimedia/opierec/wavFile.h | 1 |
9 files changed, 791 insertions, 801 deletions
diff --git a/noncore/multimedia/opierec/device.cpp b/noncore/multimedia/opierec/device.cpp index 11071d8..ce49e96 100644 --- a/noncore/multimedia/opierec/device.cpp +++ b/noncore/multimedia/opierec/device.cpp @@ -4,7 +4,7 @@ #include <qpe/config.h> #include <qpe/qcopenvelope_qws.h> -#include <qpe/custom.h> + #include <fcntl.h> #include <stdio.h> @@ -26,7 +26,7 @@ Device::Device( QObject * parent, const char * dsp, const char * mixr, bool reco { dspstr = (char *)dsp; mixstr = (char *)mixr; - + devForm=-1; devCh=-1; devRate=-1; @@ -38,7 +38,9 @@ Device::Device( QObject * parent, const char * dsp, const char * mixr, bool reco qDebug("setting up DSP for recording"); flags = O_RDWR; // flags = O_RDONLY; - selectMicInput(); + +// selectMicInput(); + } } @@ -94,6 +96,7 @@ void Device::changedOutVolume(int vol) { cfg.setGroup("Volume"); cfg.writeEntry("VolumePercent", QString::number( vol )); QCopEnvelope( "QPE/System", "volumeChange(bool)" ) << false; + qWarning("changing output vol %d", vol); } ::close(fd); } @@ -108,12 +111,13 @@ void Device::changedInVolume(int vol ) { cfg.setGroup("Volume"); cfg.writeEntry("Mic", QString::number(vol )); QCopEnvelope( "QPE/System", "micChange(bool)" ) << false; + qWarning("changing input volume %d", vol); } ::close(fd); } bool Device::selectMicInput() { -/* + int md=0; int info=MIXER_WRITE(SOUND_MIXER_MIC); md = ::open( "/dev/mixer", O_RDWR ); @@ -126,7 +130,7 @@ bool Device::selectMicInput() { return false; } ::close(md); -*/ + return true; } @@ -145,18 +149,22 @@ exit(1); break; case 0: { */ - if (( sd = ::open( dspstr, flags)) == -1) { +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(errorMsg); + qDebug("XXXXXXXXXXXXXXXXXXXXXXX "+errorMsg); return -1; } +qDebug("Opening mixer"); int mixerHandle=0; - /* Set the input dsp device and its input gain the weird Zaurus way */ - if (( mixerHandle = open("/dev/mixer1",O_RDWR))<0) { - perror("open(\"/dev/mixer1\")"); + if (( mixerHandle = open("/dev/mixer",O_RDWR))<0) { + 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){ @@ -199,16 +207,16 @@ exit(1); // bool ok; // sd = s.toInt(&ok, 10); // qDebug("<<<<<<<<<<<<<>>>>>>>>>>>>"+s); - + // f2.close(); // } ::close(mixerHandle ); - qDebug("open device %s", dspstr); - qDebug("success! %d",sd); +// qDebug("open device %s", dspstr); +// qDebug("success! %d",sd); return sd; } -bool Device::closeDevice( bool b) { +bool Device::closeDevice( bool) { // if(b) {//close now // if (ioctl( sd, SNDCTL_DSP_RESET, 0) == -1) { // perror("ioctl(\"SNDCTL_DSP_RESET\")"); @@ -222,7 +230,7 @@ bool Device::closeDevice( bool b) { ::close( sd); //close sound device // sdfd=0; // sd=0; - qDebug("closed dsp"); +// qDebug("closed dsp"); return true; } @@ -290,7 +298,7 @@ int Device::getDeviceRate() { int Device::getDeviceBits() { int dBits=0; -#if !defined(OPIE_NO_SOUND_PCM_READ_BITS) // zaurus doesnt have this +#ifndef QT_QWS_EBX // zaurus doesnt have this if (ioctl( sd, SOUND_PCM_READ_BITS, &dBits) == -1) { perror("ioctl(\"SNDCTL_PCM_READ_BITS\")"); } @@ -308,11 +316,12 @@ int Device::getDeviceChannels() { int Device::getDeviceFragSize() { int frag_size; - + if (ioctl( sd, SNDCTL_DSP_GETBLKSIZE, &frag_size) == -1) { qDebug("no fragsize"); - } else + } else { qDebug("driver says frag size is %d", frag_size); + } return frag_size; } @@ -333,3 +342,17 @@ bool Device::reset() { } return true; } + +int Device::devRead(int soundDescriptor, short *buf, int size) { + int number = 0; + number = ::read( soundDescriptor, (char *)buf, size); + return number; +} + +int Device::devWrite(int soundDescriptor, short * buf, int size) { + int bytesWritten = 0; + bytesWritten = ::write( soundDescriptor, buf, size); + return bytesWritten; +} + + diff --git a/noncore/multimedia/opierec/device.h b/noncore/multimedia/opierec/device.h index f92be98..8152e85 100644 --- a/noncore/multimedia/opierec/device.h +++ b/noncore/multimedia/opierec/device.h @@ -5,37 +5,40 @@ #include <sys/soundcard.h> class Device : public QObject { - Q_OBJECT + Q_OBJECT public: - Device( QObject * parent=0, const char * dspStr=0, const char * mixerStr=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(); + Device( QObject * parent=0, const char * dspStr=0, const char * mixerStr=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; - bool selectMicInput(); - int openDevice( int ); + int devRes, devCh, devRate, devForm, flags; + char *dspstr, *mixstr; + bool selectMicInput(); + int openDevice( int ); private slots: protected: diff --git a/noncore/multimedia/opierec/main.cpp b/noncore/multimedia/opierec/main.cpp index 4a94800..e36d050 100644 --- a/noncore/multimedia/opierec/main.cpp +++ b/noncore/multimedia/opierec/main.cpp @@ -12,5 +12,8 @@ #include "qtrec.h" #include <qpe/qpeapplication.h> #include <opie/oapplicationfactory.h> - + OPIE_EXPORT_APP( OApplicationFactory<QtRec> ) + + + diff --git a/noncore/multimedia/opierec/opierec.control b/noncore/multimedia/opierec/opierec.control index cb97933..b01406e 100644 --- a/noncore/multimedia/opierec/opierec.control +++ b/noncore/multimedia/opierec/opierec.control @@ -1,5 +1,5 @@ Package: opierec -Files: plugins/application/libopierec.so* bin/opierec pics/opierec apps/Applications/opierec.desktop +Files: bin/opierec pics/opierec apps/Applications/opierec.desktop Priority: optional Section: multimedia/applications Maintainer: L.J. Potter <ljp@llornkcor.com> diff --git a/noncore/multimedia/opierec/opierec.pro b/noncore/multimedia/opierec/opierec.pro index 7dbc4f7..b607c09 100644 --- a/noncore/multimedia/opierec/opierec.pro +++ b/noncore/multimedia/opierec/opierec.pro @@ -1,11 +1,26 @@ -CONFIG = qt warn_on debug +CONFIG = qt warn_on release #CONFIG = qt warn_on release quick-app -HEADERS = adpcm.h pixmaps.h qtrec.h device.h wavFile.h -SOURCES = adpcm.c main.cpp qtrec.cpp device.cpp wavFile.cpp +HEADERS = adpcm.h \ + pixmaps.h \ + helpwindow.h \ + qtrec.h \ + device.h \ + wavFile.h \ + waveform.h +SOURCES = adpcm.c \ + helpwindow.cpp \ + main.cpp \ + qtrec.cpp \ + device.cpp \ + wavFile.cpp \ + waveform.cpp INCLUDEPATH += $(OPIEDIR)/include DEPENDPATH += $(OPIEDIR)/include +#LIBS += -L/opt/buildroot-opie/output/staging/target/lib -lqpe -lpthread -ljpeg -lpng -lz LIBS += -lqpe -lpthread -INTERFACES = +INTERFACES = TARGET = opierec -#TMAKE_CXXFLAGS += -DQT_QWS_VERCEL_IDR -DQWS -fno-exceptions -fno-rtti +DESTDIR=$(OPIEDIR)/bin + include ( $(OPIEDIR)/include.pro ) + diff --git a/noncore/multimedia/opierec/qtrec.cpp b/noncore/multimedia/opierec/qtrec.cpp index 1e36c96..aeab26d 100644 --- a/noncore/multimedia/opierec/qtrec.cpp +++ b/noncore/multimedia/opierec/qtrec.cpp @@ -8,6 +8,8 @@ #include "pixmaps.h" #include "qtrec.h" +#include "waveform.h" +#include "device.h" #include <pthread.h> @@ -17,10 +19,6 @@ extern "C" { #include <sys/soundcard.h> -// #if defined (QTOPIA_INTERNAL_FSLP) -// #include <qpe/lnkproperties.h> -// #endif - #include <qpe/config.h> #include <qpe/qcopenvelope_qws.h> #include <qpe/qpeapplication.h> @@ -55,16 +53,30 @@ extern "C" { #include <sys/types.h> #include <sys/vfs.h> #include <unistd.h> -#include<sys/wait.h> +#include <sys/wait.h> #include <sys/signal.h> +#if defined(QT_QWS_SL5XXX) +///#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 + //#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; */ @@ -85,234 +97,315 @@ typedef struct { fileParameters filePara; -bool monitoring, recording; +bool monitoring, recording, playing; 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 -#define DSPSTROUT "/dev/dsp" -#define DSPSTRIN "/dev/dsp" -#define DSPSTRMIXERIN "/dev/mixer" -#define DSPSTRMIXEROUT "/dev/mixer" -//#endif +Waveform* waveform; +Device *soundDevice; // threaded recording -void quickRec() { +//fuckin fulgy here +void quickRec() +{ //void QtRec::quickRec() { + qDebug("%d", + filePara.numberSamples/filePara.sampleRate * filePara.channels); + qDebug("samples %d, rate %d, channels %d", + filePara.numberSamples, filePara.sampleRate, filePara.channels); + 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); + bytesWritten = 0; + number = 0; + QString num; + int level = 0; + int threshold = 0; +// int bits = filePara.resolution; +// qDebug("bits %d", bits); 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); +// qDebug("AFMT_S16_LE size %d", filePara.SecondsToRecord); +// qDebug("samples to record %d", filePara.samplesToRecord); +// qDebug("%d", filePara.sd); + level = 7; + threshold = 0; + + if( filePara.format == WAVE_FORMAT_DVI_ADPCM) { +// qDebug("start recording WAVE_FORMAT_DVI_ADPCM"); + // <<<<<<<<<<<<<<<<<<<<<<<<<<< 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 + if ( stopped) { + qDebug("quickRec:: stopped"); + break; } - number=::read( filePara.sd, sbuf, BUFSIZE); +// number=::read( filePara.sd, sbuf, BUFSIZE); + number = soundDevice ->devRead( filePara.sd, sbuf, BUFSIZE); + if(number <= 0) { perror("recording error "); - // qDebug( "%s %d", filePara.fileName, number); - // errorStop(); - recording=stopped=false; -// QMessageBox::message("Note", "Error recording to file\n%s",filePara.fileName); + qDebug( "%s %d", filePara.fileName, number); + 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 , abuf, number/4); - long peak; - for (int i = 0; i < number; i++) - { //since Z is mono do normally - peak = findPeak((long)sbuf[i]); - printf("peak %ld\r",peak); - fflush(stdout); - } - //------------->>>> out to file - // if(filePara.channels==1) - // total += bytesWritten/2; //mono - // else + bytesWritten = soundDevice->devWrite( filePara.fd , (short *)abuf, number/4); + waveform->newSamples( (const short *)abuf, bytesWritten ); + total += bytesWritten; filePara.numberSamples = total; -// if( total >= filePara.samplesToRecord) -// timeSlider->setValue(0); -// else if( filePara.SecondsToRecord !=0) timeSlider->setValue( total); - filePara.numberOfRecordedSeconds = (float)total / (float)filePara.sampleRate * (float)2; - ioctl( filePara.sd, SNDCTL_DSP_GETIPTR, &info); - timeString.sprintf("%.2f", filePara.numberOfRecordedSeconds); - timeLabel->setText( timeString + " seconds"); + filePara.numberOfRecordedSeconds = (float)total / (float)filePara.sampleRate * (float)2 / filePara.channels; qApp->processEvents(); - if( total >= filePara.samplesToRecord) + if( total >= filePara.samplesToRecord) { + stopped = true; break; + } } } else { - // qDebug("start recording WAVE_FORMAT_PCM"); - short inbuffer[BUFSIZE], outbuffer[BUFSIZE]; - memset( inbuffer,0,BUFSIZE); - memset( outbuffer,0,BUFSIZE); + // <<<<<<<<<<<<<<<<<<<<<<<<<<< WAVE_FORMAT_PCM >>>>>>>>>>>>>>>>>>>>>> + qDebug("start recording WAVE_FORMAT_PCM"); + short inbuffer[ BUFSIZE ], outbuffer[ BUFSIZE ]; + memset( inbuffer, 0, BUFSIZE); + memset( outbuffer, 0, BUFSIZE); + for(;;) { - if (stopped) { + if ( stopped) { + qDebug("quickRec:: stopped"); + stopped = true; break; // stop if playing was set to false + return; } - number=::read( filePara.sd, inbuffer, BUFSIZE); - if(number <= 0) { - perror("recording error "); - recording=stopped=false; - // errorStop(); - return;// false; + number = soundDevice ->devRead( filePara.sd, (short *)inbuffer, BUFSIZE); + waveform->newSamples( inbuffer, number ); + + if( number <= 0) { + perror( "recording error "); + qDebug( filePara.fileName); + stopped = true; + return; } -/* for (int i=0;i< number;i++) { //2*i is left channel -outbuffer[i]=inbuffer[i]>>1; // no clippy, please -}*/ - bytesWritten = ::write( filePara.fd , inbuffer, number); -//------------->>>> out to file - if(bytesWritten < 0) { - // errorStop(); + + bytesWritten = soundDevice->devWrite( filePara.fd , inbuffer, number); + + if( bytesWritten < 0) { perror("File writing error "); - return;// false; + stopped = true; + return; } - // if(filePara.channels==1) - // total += bytesWritten/2; //mono - // else total += bytesWritten; - long peak; - for (int i = 0; i < number; i++) - { //since Z is mono do normally - peak = findPeak((long)inbuffer[i]); - printf("peak %ld\r",peak); - fflush(stdout); - } + filePara.numberSamples = total; - if(filePara.SecondsToRecord !=0) + + if( filePara.SecondsToRecord != 0) timeSlider->setValue( total); // printf("Writing number %d, bytes %d,total %d\r",number, bytesWritten , total); // fflush(stdout); - ioctl( filePara.sd, SNDCTL_DSP_GETIPTR, &info); -// qDebug("%d, %d", info.bytes, ( info.bytes / filePara.sampleRate) / 2); + filePara.numberOfRecordedSeconds = (float)total / (float)filePara.sampleRate / (float)2/filePara.channels; - filePara.numberOfRecordedSeconds = (float)total / (float)filePara.sampleRate / (float)2; - timeString.sprintf("%.2f", filePara.numberOfRecordedSeconds); - timeLabel->setText( timeString + " seconds"); qApp->processEvents(); - if( total >= filePara.samplesToRecord) + + if( total >= filePara.samplesToRecord) { + stopped = true; break; } + } } //end main loop } else { // <<<<<<<<<<<<<<<<<<<<<<< format = AFMT_U8; - unsigned char unsigned_inbuffer[BUFSIZE], unsigned_outbuffer[BUFSIZE]; + unsigned char unsigned_inbuffer[ BUFSIZE ], unsigned_outbuffer[ BUFSIZE ]; memset( unsigned_inbuffer, 0, BUFSIZE); memset( unsigned_outbuffer, 0, BUFSIZE); for(;;) { - if (stopped) { - // qDebug("quickRec:: stopped"); + if ( stopped) { + qDebug("quickRec:: stopped"); break; // stop if playing was set to false } - number=::read( filePara.sd, unsigned_inbuffer, BUFSIZE); -//-------------<<<< in from device -// val = (data ^ 0x80) << 8; - -//unsigned_outbuffer = (unsigned_inbuffer ^ 0x80) << 8; - -// if(number <= 0) { -// perror("recording error "); -// qDebug(filePara.fileName); -// // errorStop(); -// QMessageBox::message("Note","error recording"); -// return;// false; -// } -// for (int i=0;i< number;i++) { //2*i is left channel -// unsigned_outbuffer[i]=unsigned_inbuffer[i]>>1; // no clippy, please -// } - + + number = ::read( filePara.sd, unsigned_inbuffer, BUFSIZE); bytesWritten = ::write( filePara.fd , unsigned_inbuffer, number); -//------------->>>> out to file if(bytesWritten < 0) { - recording=stopped=false; - // errorStop(); + stopped = true; QMessageBox::message("Note","There was a problem\nwriting to the file"); perror("File writing error "); - return;// false; + return; } + total += bytesWritten; filePara.numberSamples = total; // printf("\nWriting number %d, bytes %d,total %d \r",number, bytesWritten , total); // fflush(stdout); - if(filePara.SecondsToRecord !=0) + if( filePara.SecondsToRecord !=0) timeSlider->setValue( total); filePara.numberOfRecordedSeconds = (float)total / (float)filePara.sampleRate; - timeString.sprintf("%.2f",filePara.numberOfRecordedSeconds); - timeLabel->setText( timeString + " seconds"); - qApp->processEvents(); - if( total >= filePara.samplesToRecord) + if( total >= filePara.samplesToRecord) { + stopped = true; break; + } } //end main loop } -// qDebug("Final %d, %d", filePara.samplesToRecord , filePara.numberOfRecordedSeconds); } /// END quickRec() -// threaded play -void playIt() { +void playIt() +{ + int bytesWritten, number; + 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 ); + // 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, bytesWritten ); + //-------------->>>> 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) { + qWarning("Jane! Stop this crazy thing!"); + 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 ) { - // QCopEnvelope( "QPE/System", "volumeChange(bool)" ) << true; // mute device - // autoMute=TRUE; -// QPEApplication::grabKeyboard(); +QtRec::QtRec( QWidget* parent, const char* name, WFlags fl ) + : QWidget( parent, name, fl ) +{ if ( !name ) setName( "OpieRec" ); init(); @@ -330,19 +423,19 @@ QtRec::QtRec( QWidget* parent, const char* name, WFlags fl ) getInVol(); getOutVol(); - soundDevice->closeDevice( true); - soundDevice->sd=-1; - soundDevice=0; - wavFile=0; + soundDevice->closeDevice( true); + soundDevice->sd = -1; + soundDevice = 0; + wavFile = 0; - if(soundDevice) delete soundDevice; + if( soundDevice) delete soundDevice; initIconView(); - if(autoMute) - doMute(true); + if( autoMute) + doMute( true); ListView1->setFocus(); - playing=false; + playing = false; } QtRec::~QtRec() { @@ -351,30 +444,28 @@ QtRec::~QtRec() { void QtRec::cleanUp() { - if(!stopped) { - stopped=true; + if( !stopped) { + stopped = true; endRecording(); } ListView1->clear(); - if(autoMute) + if( autoMute) doMute(false); - if(wavFile) delete wavFile; + if( wavFile) delete wavFile; // if(soundDevice) delete soundDevice; -// QPEApplication::grabKeyboard(); -// QPEApplication::ungrabKeyboard(); } void QtRec::init() { - needsStereoOut=false; + needsStereoOut = false; QPixmap image3( ( const char** ) image3_data ); QPixmap image4( ( const char** ) image4_data ); QPixmap image6( ( const char** ) image6_data ); - stopped=true; + stopped = true; setCaption( tr( "OpieRecord " ) + QString::number(VERSION) ); QGridLayout *layout = new QGridLayout( this ); layout->setSpacing( 2); @@ -382,7 +473,7 @@ void QtRec::init() { TabWidget = new QTabWidget( this, "TabWidget" ); layout->addMultiCellWidget(TabWidget, 0, 7, 0, 7); - // TabWidget->setTabShape(QTabWidget::Triangular); +// TabWidget->setTabShape(QTabWidget::Triangular); ///**********<<<<<<<<<<<<>>>>>>>>>>>>*************** tab = new QWidget( TabWidget, "tab" ); @@ -392,52 +483,52 @@ void QtRec::init() { layout1->setMargin( 2); timeSlider = new QSlider( 0,100,10,0, QSlider::Horizontal, tab, (const char *) "timeSlider" ); - // timeSlider->setFixedWidth(150); layout1->addMultiCellWidget( timeSlider, 1, 1, 0, 3); -// timeSlider->setTickmarks(QSlider::Above); timeLabel = new QLabel( tab, "TimeLabel" ); layout1->addMultiCellWidget( timeLabel, 0, 0, 0, 3); playLabel2 = new QLabel(tab, "PlayLabel2" ); playLabel2->setText(tr("Play") ); - playLabel2->setFixedHeight(18); + 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->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->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->setFixedSize( 22, 22); toEndButton->setPixmap( Resource::loadPixmap( "fastforward" ) ); QLabel *recLabel2; recLabel2 = new QLabel( tab, "recLabel2" ); recLabel2->setText(tr("Rec")); - recLabel2->setFixedHeight(18); + 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->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() ), SLOT( rewindTimerTimeout() ) ); + connect( rewindTimer, SIGNAL( timeout() ), + this, SLOT( rewindTimerTimeout() ) ); forwardTimer = new QTimer( this ); - connect( forwardTimer, SIGNAL( timeout() ), SLOT( forwardTimerTimeout() ) ); + connect( forwardTimer, SIGNAL( timeout() ), + this, SLOT( forwardTimerTimeout() ) ); deleteSoundButton = new QPushButton( tab, "deleteSoundButton" ); layout1->addMultiCellWidget( deleteSoundButton, 1, 1, 8, 8); @@ -447,40 +538,30 @@ void QtRec::init() { layout1->addMultiCellWidget( ListView1, 2, 2, 0, 8); ListView1->addColumn( tr( "Name" ) ); - ListView1->setColumnWidth(0,140); + ListView1->setColumnWidth( 0, 140); ListView1->setSorting( 1, false); ListView1->addColumn( tr( "Time" ) ); //in seconds - ListView1->setColumnWidth(1,50); + ListView1->setColumnWidth( 1, 50); ListView1->addColumn( tr("Location") ); - ListView1->setColumnWidth(2,50); + ListView1->setColumnWidth( 2, 50); ListView1->addColumn( tr("Date") ); - ListView1->setColumnWidth(3,63); + ListView1->setColumnWidth( 3, 63); - ListView1->setColumnWidthMode(0,QListView::Manual); - ListView1->setColumnAlignment(1,QListView::AlignCenter); - ListView1->setColumnAlignment(2,QListView::AlignRight); - ListView1->setColumnAlignment(3,QListView::AlignLeft); + 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); + 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); //////////////////////////////////// - - Layout19 = new QHBoxLayout( tab_3); - Layout19->setSpacing( 2 ); - Layout19->setMargin( 0 ); - - Layout18 = new QVBoxLayout(this); - Layout18->setSpacing( 2 ); - Layout18->setMargin( 0 ); - - Layout17 = new QHBoxLayout(this); - Layout17->setSpacing( 2 ); - Layout17->setMargin( 0 ); - sampleGroup = new QGroupBox( tab_3, "samplegroup" ); sampleGroup->setTitle( tr( "Sample Rate" ) ); sampleGroup->setFixedSize( 95,50); @@ -498,66 +579,54 @@ void QtRec::init() { sampleRateComboBox->insertItem( tr( "8000")); //#endif - Layout17->addWidget( sampleGroup ); + glayout3->addMultiCellWidget( sampleGroup, 0, 0, 0, 0); sizeGroup= new QGroupBox( tab_3, "sizeGroup" ); sizeGroup->setTitle( tr( "Limit Size" ) ); - sizeGroup->setFixedSize(80,50); + 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)); + sizeLimitCombo->insertItem( QString::number( i * 5)); } -// sizeLimitCombo->insertItem(tr("5 secs")); -// sizeLimitCombo->insertItem(tr("10 secs")); -// sizeLimitCombo->insertItem(tr("15 secs")); -// sizeLimitCombo->insertItem(tr("20 secs")); - - // Layout18->addWidget( sizeGroup ); - Layout17->addWidget( sizeGroup ); - - Layout18->addLayout( Layout17 ); - - Layout16 = new QHBoxLayout(this); - Layout16->setSpacing( 2 ); - Layout16->setMargin( 0 ); + glayout3->addMultiCellWidget( sizeGroup, 0, 0, 1, 1); dirGroup = new QGroupBox( tab_3, "dirGroup" ); dirGroup->setTitle( tr( "File Directory" ) ); - dirGroup->setFixedSize(130,50); + dirGroup->setFixedSize( 130, 50); directoryComboBox = new QComboBox( false, dirGroup, "dirGroup" ); directoryComboBox->setGeometry( QRect( 10, 15, 115, 25 ) ); - Layout18->addWidget( dirGroup ); + glayout3->addMultiCellWidget( dirGroup, 1, 1, 0, 0); bitGroup = new QGroupBox( tab_3, "bitGroup" ); bitGroup->setTitle( tr( "Bit Depth" ) ); - bitGroup->setFixedSize(65,50); + bitGroup->setFixedSize( 65, 50); bitRateComboBox = new QComboBox( false, bitGroup, "BitRateComboBox" ); bitRateComboBox->insertItem( tr( "16" ) ); bitRateComboBox->insertItem( tr( "8" ) ); bitRateComboBox->setGeometry( QRect( 5, 20, 50, 25 ) ); - Layout18->addWidget( bitGroup ); + glayout3->addMultiCellWidget( bitGroup, 1, 1, 1, 1); compressionCheckBox = new QCheckBox ( tr("Wave Compression (smaller files)"), tab_3 ); - Layout18->addWidget( compressionCheckBox ); - autoMuteCheckBox= new QCheckBox ( tr("auto Mute"), tab_3 ); - Layout18->addWidget( autoMuteCheckBox ); + autoMuteCheckBox = new QCheckBox ( tr("Auto Mute"), tab_3 ); + stereoCheckBox = new QCheckBox ( tr("Stereo Channels"), tab_3 ); - Layout19->addLayout( Layout18 ); + glayout3->addMultiCellWidget( compressionCheckBox, 2, 2, 0, 3); + glayout3->addMultiCellWidget( autoMuteCheckBox, 3, 3, 0, 0); + glayout3->addMultiCellWidget( stereoCheckBox, 3, 3, 1, 1); QWidget *d = QApplication::desktop(); - int width=d->width(); - int height=d->height(); - - + int width = d->width(); + int height = d->height(); if( width < height) { @@ -568,18 +637,17 @@ void QtRec::init() { Layout19a->setSpacing( 2 ); Layout19a->setMargin( 0 ); - - Layout15 = new QVBoxLayout(this); + Layout15 = new QVBoxLayout( this); Layout15->setSpacing( 2 ); Layout15->setMargin( 0 ); - Layout15b = new QVBoxLayout(this); + Layout15b = new QVBoxLayout( this); Layout15b->setSpacing( 2 ); Layout15b->setMargin( 0 ); TextLabel2 = new QLabel( tab_5, "InputLabel" ); TextLabel2->setText( tr( "In")); - TextLabel2->setFixedWidth(35); + TextLabel2->setFixedWidth( 35); Layout15->addWidget( TextLabel2 ); TextLabel3 = new QLabel( tab_5, "OutputLabel" ); @@ -587,11 +655,11 @@ void QtRec::init() { Layout15b->addWidget( TextLabel3 ); InputSlider = new QSlider( -100, 0, 10, 0, QSlider::Vertical, tab_5, (const char *) "InputSlider" ); - InputSlider->setTickmarks(QSlider::Both); + 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); + OutputSlider->setTickmarks( QSlider::Both); Layout15b->addWidget( OutputSlider ); @@ -634,11 +702,11 @@ void QtRec::init() { Layout15b->addWidget( TextLabel3 ); InputSlider = new QSlider( -100, 0, 10, 0, QSlider::Vertical, tab_3, (const char *) "InputSlider" ); - // InputSlider->setTickmarks(QSlider::Both); + InputSlider->setTickmarks(QSlider::Both); Layout15->addWidget( InputSlider); OutputSlider = new QSlider( -100,0,10,0, QSlider::Vertical,tab_3,(const char *) "OutputSlider" ); - // OutputSlider->setTickmarks(QSlider::Both); + OutputSlider->setTickmarks(QSlider::Both); Layout15b->addWidget( OutputSlider ); @@ -659,35 +727,12 @@ void QtRec::init() { } + waveform = new Waveform( this, "waveform" ); +// waveform->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)5, (QSizePolicy::SizeType)3, waveform->sizePolicy().hasHeightForWidth() ) ); + waveform->setMinimumSize( QSize( 0, 50 ) ); - ///**********<<<<<<<<<<<<>>>>>>>>>>>>*************** - -// tab_4 = new QWidget( TabWidget, "tab_4" ); -// QGridLayout *layout4 = new QGridLayout( tab_4); -// layout4->setSpacing( 2); -// layout4->setMargin( 2); -// TabWidget->insertTab( tab_4, tr( "Help")); - -// ///////////////////////////////////////////// FIXME change to a real helpfile path -// QString url="/index.html"; -// HelpWindow *help = new HelpWindow( url, ".", tab_4, "opierec_help"); -// layout4->addMultiCellWidget( help, 0, 1, 0, 1); -// if( !QFile(url).exists()) { -// help->hide(); -// //help->showMaximized(); -// QLabel *helpLabel; -// helpLabel = new QLabel( tab_4, "TimeLabel" ); -// layout4->addMultiCellWidget( helpLabel, 0, 3, 0, 4 ); -// helpLabel->setText( "<B>OpieRec</B><br>" -// "Records files in standard wav format<br>" -// "or a compressed version<br>" -// "For help, please email the author<br>" -// "<B>OpieRec</B> is copyright© 2002 by" -// " L.J. Potter<br>llornkcor@handhelds.org<BR>" -// "and is licensed under the <B>QPL</B>"); -// } - ///**********<<<<<<<<<<<<>>>>>>>>>>>>*************** - + layout->addMultiCellWidget( waveform, 8, 8, 0, 7 ); + waveform->setBackgroundColor ( black ); } void QtRec::initIconView() { @@ -698,27 +743,27 @@ void QtRec::initIconView() { QString temp; QPixmap image0( ( const char** ) image0_data ); - int nFiles = cfg.readNumEntry("NumberofFiles",0); + qDebug("init number of files %d", nFiles); + 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 - // qDebug(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()) { + mediaLocation = getStorage( filePath); + if( info.exists()) { item = new QListViewItem( ListView1, temp, fileS, mediaLocation, fileDate); item->setPixmap( 0, image0); - if(currentFileName == filePath) + if( currentFileName == filePath) ListView1->setSelected( item, true); } } @@ -727,34 +772,59 @@ void QtRec::initIconView() { 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( OutputSlider, SIGNAL(valueChanged( int)), this, SLOT(changedOutVolume(int)) ); - // connect( InputSlider, SIGNAL(valueChanged( int)), this, SLOT(changedInVolume(int)) ); - - 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( 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( 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))); + 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() { @@ -767,28 +837,30 @@ void QtRec::initConfig() { for(int ws=0;ws<sampleRateComboBox->count();ws++) { fred = sampleRateComboBox->text(ws).toInt(&ok, 10); - if(index == fred) { + if( index == fred) { filePara.sampleRate = fred; sampleRateComboBox->setCurrentItem(ws); } } - i=cfg.readNumEntry("bitrate",16); + i = cfg.readNumEntry("bitrate",16); if(i == 16) bitRateComboBox->setCurrentItem( 0); else bitRateComboBox->setCurrentItem( 1); filePara.resolution = i; - i=cfg.readNumEntry("sizeLimit", 5 ); + i = cfg.readNumEntry("sizeLimit", 5 ); QString temp; -// for(int i=1;i<13; i++) { -// temp = sizeLimitCombo->text(i); - -// sizeLimitCombo->insertItem( QString::number(i*5)+tr(" secs")); -// } 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); @@ -808,20 +880,15 @@ void QtRec::initConfig() { inMuteCheckBox->setChecked( cofg.readBoolEntry( "MicMute",0)); } -//================ - void QtRec::stop() { - // qDebug("<<<<<<<<<stop()"); + qWarning("STOP"); setRecordButton(false); - monitoring=false; - stopped=true; if( !recording) endPlaying(); else endRecording(); timeSlider->setValue(0); - // QCopEnvelope( "QPE/System", "volumeChange(bool)" ) << true; // mute device } void QtRec::doPlayBtn() { @@ -838,13 +905,13 @@ void QtRec::doPlayBtn() { } void QtRec::start() { //play - if(stopped) { + if( stopped) { QPixmap image3( ( const char** ) image3_data ); Stop_PushButton->setPixmap( image3 ); - Stop_PushButton->setDown(true); - stopped=false; - paused=false; - secCount=1; + Stop_PushButton->setDown( true); + stopped = false; + paused = false; + secCount = 1; if( openPlayFile()) if( setupAudio( false)) //recording is false @@ -853,42 +920,58 @@ void QtRec::start() { //play } bool QtRec::rec() { //record + QString timeString; + timeString.sprintf("%.0f", 0.0); + timeLabel->setText( timeString+ " seconds"); if(!stopped) { - monitoring=true; + monitoring = true; return false; } else { - secCount=1; + secCount = 1; playLabel2->setText(tr("Stop")); - monitoring=false; - setRecordButton(true); - stopped=false; + monitoring = false; + setRecordButton( true); if( setupAudio( true)) if(setUpFile()) { - int fileSize=0; + int fileSize = 0; Config cfg("OpieRec"); cfg.setGroup("Settings"); +// qDebug( "<<<<<<<Device bits %d, device rate %d, device channels %d", +// soundDevice->getDeviceBits(), +// soundDevice->getDeviceRate(), +// soundDevice->getDeviceChannels()); + //filePara.sampleRate = cfg.readNumEntry("samplerate", 22050); - // qDebug("sample rate is %d", filePara.sampleRate); +// qDebug("sample rate is %d", filePara.sampleRate); filePara.SecondsToRecord = getCurrentSizeLimit(); +// qDebug("size limit %d sec", filePara.SecondsToRecord); int diskSize = checkDiskSpace( (const QString &) wavFile->trackName()); if( filePara.SecondsToRecord == 0) { fileSize = diskSize; - } else if( filePara.format==WAVE_FORMAT_PCM) { + } else if( filePara.format == WAVE_FORMAT_PCM) { +// qDebug("WAVE_FORMAT_PCM"); fileSize = (filePara.SecondsToRecord ) * filePara.channels - * filePara.sampleRate *(filePara.resolution/8)+1000; + * filePara.sampleRate * ( filePara.resolution / 8) + 1000; } else { +// qDebug("WAVE_FORMAT_DVI_ADPCM"); fileSize = ((filePara.SecondsToRecord) * filePara.channels - * filePara.sampleRate *(filePara.resolution/8) )/4+250; + * filePara.sampleRate * ( filePara.resolution / 8) ) / 4 + 250; } filePara.samplesToRecord = fileSize; - if(paused) { + qDebug("filesize should be %d, bits %d, rate %d", + filePara.samplesToRecord, filePara.resolution, filePara.sampleRate); + if( paused) { paused = false; } + // else { + qDebug("Setting timeslider %d", filePara.samplesToRecord); + // if(fileSize != 0) timeSlider->setRange(0, filePara.samplesToRecord); + // } if( diskSize < fileSize/1024) { QMessageBox::warning(this, @@ -904,54 +987,39 @@ bool QtRec::rec() { //record setCaption( msg); #endif filePara.fileName=currentFile.latin1(); +// qDebug("Start recording thread"); + stopped = false; - pthread_t thread1; - pthread_create( &thread1, NULL, (void * (*)(void *))quickRec, NULL/* &*/); - toBeginningButton->setEnabled(false); - toEndButton->setEnabled(false); + pthread_t thread1; + pthread_create( &thread1, NULL, (void * (*)(void *))quickRec, NULL/* &*/); + toBeginningButton->setEnabled( false); + toEndButton->setEnabled( false); startTimer(1000); +// quickRec(); } } //end setUpFile } //end setupAudio - // _exit( 0); - - // ///* default: -// // /* pid greater than zero is parent getting the child's pid */ -// /* printf("Child's pid is %d\n",pid); -// waitpid( pid, &status, 0); -// printf("Child[%d] exited with status %d\n", pid, status);*/ - // while (wait(NULL) != pid) -// ; -// printf("child %ld terminated normally, return status is zero\n", (long) pid); - // endRecording(); -/* else { //device was not opened - qDebug("Audio device open failed"); - return false; - } - }*/ -// } //end fork -// } -// } return true; } /* This happens when a tab is selected*/ void QtRec::thisTab(QWidget* widg) { if(widg != NULL) { - int index=TabWidget->currentPageIndex(); + int index = TabWidget->currentPageIndex(); -// if(index==0) { //file page -// } + if(index == 0) { //file page + } - if(index ==1) { //control page + if(index == 1) { //control page fillDirectoryCombo(); // soundDevice->getOutVol(); // soundDevice->getInVol(); } -// if(index==2) { //help page -// } + if( index==2) { //help page + } + qApp->processEvents(); update(); } @@ -959,16 +1027,18 @@ void QtRec::thisTab(QWidget* widg) { void QtRec::getOutVol( ) { filePara.outVol = soundDevice->getOutVolume(); +// qDebug("out vol %d", filePara.outVol); OutputSlider->setValue( -filePara.outVol); } void QtRec::getInVol() { filePara.inVol = soundDevice->getInVolume(); +// qDebug("in vol %d", filePara.inVol); InputSlider->setValue( -filePara.inVol); } void QtRec::changedOutVolume() { - soundDevice->changedOutVolume(-OutputSlider->value()); + soundDevice->changedOutVolume( -OutputSlider->value()); } void QtRec::changedInVolume( ) { @@ -983,19 +1053,21 @@ bool QtRec::setupAudio( bool b) { filePara.resolution = bitRateComboBox->currentText().toInt( &ok,10); //16 - if( !b){ // we want to play + if( !b) { +// we want to play if( filePara.resolution == 16 || compressionCheckBox->isChecked() ) { sampleformat = AFMT_S16_LE; filePara.resolution = 16; } else { sampleformat = AFMT_U8; - filePara.resolution=8; + filePara.resolution = 8; } - stereo = filePara.channels = 1; - flags= O_WRONLY; + stereo = filePara.channels; + flags = O_WRONLY; dspString = DSPSTROUT; mixerString = DSPSTRMIXEROUT; + recording = false; } else { // we want to record if( !bitRateComboBox->isEnabled() || bitRateComboBox->currentText() == "16") @@ -1004,23 +1076,35 @@ bool QtRec::setupAudio( bool b) { sampleformat = AFMT_U8; if( !compressionCheckBox->isChecked()) { - filePara.format=WAVE_FORMAT_PCM; + filePara.format = WAVE_FORMAT_PCM; +// qDebug("WAVE_FORMAT_PCM"); } else { - filePara.format=WAVE_FORMAT_DVI_ADPCM; - sampleformat=AFMT_S16_LE; + filePara.format = WAVE_FORMAT_DVI_ADPCM; + sampleformat = AFMT_S16_LE; +// qDebug("WAVE_FORMAT_DVI_ADPCM"); } - stereo = filePara.channels = 1; + stereo = filePara.channels; +// filePara.sampleRate = sampleRateComboBox->currentText().toInt( &ok,10);//44100; flags= O_RDWR; +// flags= O_RDONLY; dspString = DSPSTRIN; mixerString = DSPSTRMIXEROUT; + recording = true; } // if(soundDevice) delete soundDevice; + qDebug("<<<<<<<<<<<<<<<<<<<open dsp %d %d %d", filePara.sampleRate, filePara.channels, sampleformat); + qWarning("change waveform settings"); + waveform->changeSettings( filePara.sampleRate, filePara.channels ); + soundDevice = new Device( this, dspString, mixerString, b); // soundDevice->openDsp(); soundDevice->reset(); + qDebug("device has been made %d", soundDevice->sd); + + ////////////////// <<<<<<<<<<<<>>>>>>>>>>>> soundDevice->setDeviceFormat( sampleformat); soundDevice->setDeviceChannels( filePara.channels); soundDevice->setDeviceRate( filePara.sampleRate); @@ -1030,15 +1114,15 @@ bool QtRec::setupAudio( bool b) { soundDevice->setFragSize( frag); soundDevice->getDeviceFragSize(); #endif - + ///////////////// filePara.sd = soundDevice->sd; if ( filePara.sd == -1) { - monitoring=false; - stopped=true; + + monitoring = false; + stopped = true; update(); - setCaption( tr( "OpieRecord " ) /*+ QString::number(VERSION)*/ ); - stopped=true; + setCaption( tr( "OpieRecord " )+ QString::number(VERSION) ); return false; } if(autoMute) @@ -1049,7 +1133,7 @@ bool QtRec::setupAudio( bool b) { bool QtRec::setUpFile() { //setup file for recording - // qDebug("Setting up wavfile"); +// qDebug("Setting up wavfile"); // if(wavFile) delete wavFile; wavFile = new WavFile( this, (const QString &)"", true, @@ -1062,7 +1146,7 @@ bool QtRec::setUpFile() { //setup file for recording if(filePara.fd == -1) { return false; } else { - filePara.channels=1; +// filePara.channels=1; } return true; } @@ -1070,163 +1154,41 @@ bool QtRec::setUpFile() { //setup file for recording /// <<<<<<<<<<<<<<<< PLAY >>>>>>>>>>>>>>>>>>> bool QtRec::doPlay() { -// pthread_t thread2; -// pthread_create( &thread2, NULL, (void * (*)(void *))playIt, NULL/* &*/); - - // qDebug("doPlay file %d", filePara.fd); - int bytesWritten, number; - recording = false; -// int number=0; if( !paused) { - // qDebug("new"); - total=0; - bytesWritten=0; + total = 0; filePara.numberOfRecordedSeconds = 0; } else { paused = false; secCount = (int)filePara.numberOfRecordedSeconds; } - playing=true; - number=0; + playing = true; + stopped = false; + recording = false; QString num; -// block=BUFSIZE; - timeSlider->setRange(0, filePara.numberSamples); - timeString.sprintf("%.2f", filePara.numberOfRecordedSeconds); + qDebug( "Play number of samples %d", filePara.numberSamples); + +// timeSlider->setRange( 0, filePara.numberSamples); + + timeString.sprintf("%d", filePara.numberOfRecordedSeconds); timeLabel->setText( timeString+ tr(" seconds")); -// if( filePara.format==WAVE_FORMAT_DVI_ADPCM) { -// // qDebug("WAVE_FORMAT_DVI_ADPCM"); -// } else { -// // qDebug("WAVE_FORMAT_PCM"); -// } QString msg; - msg.sprintf("%d, %d, %d", filePara.sampleRate, filePara.channels, filePara.resolution); + msg.sprintf("%d, %d, %d", + filePara.sampleRate, + filePara.channels, + filePara.resolution); #ifdef DEV_VERSION setCaption( msg); #endif - if( filePara.resolution == 16 ) { //AFMT_S16_LE) { - // qDebug("16 bit"); - - startTimer(1000); - - 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; // 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); - // if(filePara.channels==1) - // total += bytesWritten/2; //mono - // else - total += bytesWritten; - timeSlider->setValue( total / 4); - - filePara.numberOfRecordedSeconds = (float)total / (float)filePara.sampleRate / 2; - - 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); -// printf("playing number %d, bytes %d, total %d totalsamples %d number recorded seconds %.2f\r", -// number, bytesWritten, total/4, filePara.numberSamples, filePara.numberOfRecordedSeconds); -// fflush(stdout); - - qApp->processEvents(); - - if( bytesWritten <= 0 ){//|| secCount > filePara.numberOfRecordedSeconds ) { - stopped = true; - endPlaying(); - } - } - } else { - // <<<<<<<<<<<<<<<<<<<<<<<<<<< WAVE_FORMAT_PCM >>>>>>>>>>>>>>>>>>>>>> - short inbuffer[BUFSIZE], outbuffer[BUFSIZE]; - memset( inbuffer, 0, BUFSIZE); - memset( outbuffer, 0, BUFSIZE); - - for(;;) { // play loop - if (stopped) - break; // 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); - //-------------->>>> out to device - // total+=bytesWritten; - // if(filePara.channels==1) - // total += bytesWritten/2; //mono - // else - total += bytesWritten; - - timeSlider->setValue( total); - filePara.numberOfRecordedSeconds = (float)total / (float)filePara.sampleRate / (float)2; - - timeString.sprintf("%.2f",filePara.numberOfRecordedSeconds); - timeLabel->setText( timeString + tr(" seconds")); - - qApp->processEvents(); - if( bytesWritten <= 0 && secCount > filePara.numberOfRecordedSeconds ) { - stopped = true; - endPlaying(); - } - } -// 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 - number=::read( filePara.fd, unsigned_inbuffer, BUFSIZE); -//data = (val >> 8) ^ 0x80; - // unsigned_outbuffer = (unsigned_inbuffer >> 8) ^ 0x80; - bytesWritten = write ( filePara.sd, unsigned_inbuffer, number); - total+=bytesWritten; + startTimer( 1000); + pthread_t thread2; + pthread_create( &thread2, NULL, (void * (*)(void *))playIt, NULL/* &*/); - timeSlider->setValue( total); + toBeginningButton->setEnabled( false); + toEndButton->setEnabled( false); - filePara.numberOfRecordedSeconds=(float)total/(float)filePara.sampleRate; - timeString.sprintf("%.2f",filePara.numberOfRecordedSeconds); - timeLabel->setText( timeString + tr(" seconds")); - qApp->processEvents(); - - if( bytesWritten <= 0 && secCount > filePara.numberOfRecordedSeconds ) { - stopped = true; - endPlaying(); - } - // printf("Writing number %d, bytes %d, total %d, numberSamples %d\r",number, bytesWritten , total, filePara.numberSamples); - // fflush(stdout); - } - } - -// qDebug("\nstopped or paused %d", total/4); - if(!paused && !stopped) { - stopped = true; -// endPlaying(); - endPlaying(); - } return true; } @@ -1234,11 +1196,11 @@ bool QtRec::doPlay() { void QtRec::changebitrateCombo(int i) { Config cfg("OpieRec"); cfg.setGroup("Settings"); - int bits=0; - if(i==0) { bits=16; } + int bits = 0; + if( i == 0) { bits = 16; } else { bits=8; } cfg.writeEntry("bitrate", bits); - filePara.resolution=bits; + filePara.resolution = bits; cfg.write(); } @@ -1248,21 +1210,10 @@ void QtRec::changesamplerateCombo(int i) { int rate=0; bool ok; rate = sampleRateComboBox->text(i).toInt(&ok, 10); - cfg.writeEntry("samplerate",rate); + cfg.writeEntry( "samplerate",rate); filePara.sampleRate=rate; -/* soundDevice = new Device( this, DSPSTROUT, DSPSTRMIXER, false); - soundDevice->openDsp();*/ -// -// soundDevice->setDeviceFormat(AFMT_S16_LE); -// soundDevice->setDeviceChannels(filePara.channels); -// soundDevice->setDeviceRate(filePara.sampleRate); -// -// soundDevice->closeDevice( true); -// soundDevice=0; -// delete soundDevice; - // qDebug("Change sample rate %d", rate); + qDebug( "Change sample rate %d", rate); cfg.write(); - } @@ -1279,9 +1230,9 @@ void QtRec::changeDirCombo(int index) { if( sName == (*it)->name()+" "+ (*it)->path() || (*it)->name() == sName ) { const QString path = (*it)->path(); - recDir = path; + recDir = path; cfg.writeEntry("directory", recDir); - // qDebug("new rec dir "+recDir); + qDebug("new rec dir "+recDir); } } cfg.write(); @@ -1296,25 +1247,21 @@ void QtRec::changeSizeLimitCombo(int) { } void QtRec::newSound() { - // qDebug("<<<<<<<<<new sound"); - if( !rec()) { - // qDebug("rec() failed"); endRecording(); deleteSound(); } - } void QtRec::itClick(QListViewItem *item) { - currentFile=item->text(0); + currentFile = item->text(0); setCaption("OpieRecord "+currentFile); } void QtRec::deleteSound() { Config cfg("OpieRec"); cfg.setGroup("Sounds"); - if( ListView1->currentItem() == NULL) + if( ListView1->currentItem() == NULL) return; #ifndef DEV_VERSION switch ( QMessageBox::warning(this,tr("Delete"), @@ -1324,73 +1271,48 @@ void QtRec::deleteSound() { #endif { QString file = ListView1->currentItem()->text(0); - // qDebug("Filename to find is "+file); QString fileName; fileName = cfg.readEntry( file, ""); - QFile f(fileName); - // qDebug("fileName is "+fileName); - if(f.exists()) + QFile f( fileName); + if( f.exists()) if( !f.remove()) - QMessageBox::message(tr("Error"),tr("Could not remove file.")); + QMessageBox::message( tr("Error"), tr("Could not remove file.")); - int nFiles = cfg.readNumEntry("NumberofFiles",0); - bool found=false; + int nFiles = cfg.readNumEntry( "NumberofFiles",0); + bool found = false; for(int i=0;i<nFiles+1;i++) { - // qDebug(cfg.readEntry(QString::number(i))); if( cfg.readEntry( QString::number(i),"").find( file,0,true) != -1) { found = true; -// qDebug( cfg.readEntry(QString::number(i))+"\n" +cfg.readEntry(QString::number(i+1)) ); 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( cfg.readEntry( file)); cfg.removeEntry( file); - // cfg.removeEntry( QString::number(nFiles)); - cfg.writeEntry("NumberofFiles", nFiles-1); + cfg.writeEntry( "NumberofFiles", nFiles-1); cfg.write(); ListView1->takeItem( ListView1->currentItem() ); - // ListView1->takeItem( ListView1->itemAt(nFiles) ); delete ListView1->currentItem(); ListView1->clear(); - ListView1->setSelected(ListView1->firstChild(), true); + ListView1->setSelected( ListView1->firstChild(), true); initIconView(); update(); } #ifndef DEV_VERSION }; #endif - setCaption( tr( "OpieRecord " ) /*+ QString::number(VERSION)*/ ); + setCaption( tr( "OpieRecord " ) + QString::number(VERSION) ); } void QtRec::keyPressEvent( QKeyEvent *e) { switch ( e->key() ) { - /* - vercel keys-> - right side - 0 - 1 0x1030 Key_F1 - 2 0x1031 Key_F2 - 3 0x1032 Key_F3 - 4 0x1016 Key_PageUp - 5 0x1017 Key_PageDown - 6 - --------------- - left side - Up 0x1013 Key_Up - Down 0x1015 Key_Down - Left 0x1012 Key_Left - Right 0x1014 Key_Right - 0x1010 Key_Home - - */ // case Key_F1: // if(stopped && !recording) // newSound(); @@ -1430,7 +1352,7 @@ void QtRec::keyPressEvent( QKeyEvent *e) { // newSound(); break; case Key_Left: { - // qDebug("rewinding"); + qDebug("rewinding"); if( !e->isAutoRepeat()) rewindPressed(); } @@ -1484,7 +1406,7 @@ void QtRec::keyReleaseEvent( QKeyEvent *e) { break; case Key_Up: // stop(); - // qDebug("Up"); + qDebug("Up"); break; case Key_Down: // start(); @@ -1492,109 +1414,110 @@ void QtRec::keyReleaseEvent( QKeyEvent *e) { // newSound(); break; case Key_Left: - // qDebug("Left"); + qDebug("Left"); rewindReleased(); break; case Key_Right: - // qDebug("Right"); + qDebug("Right"); FastforwardReleased(); break; } } void QtRec::endRecording() { - // qDebug("endRecording"); - setRecordButton(false); - timeSlider->setValue(0); - toBeginningButton->setEnabled(true); - toEndButton->setEnabled(true); + monitoring = false; + recording = false; + stopped = true; + waveform->reset(); + setRecordButton( false); - monitoring=false; + toBeginningButton->setEnabled( true); + toEndButton->setEnabled( true); killTimers(); if(autoMute) - doMute(true); + doMute( true); soundDevice->closeDevice( true); - recording = false; - stopped=true; - t->stop(); - if( wavFile->track.isOpen()) { wavFile->adjustHeaders( filePara.fd, filePara.numberSamples); // soundDevice->sd=-1; - filePara.numberSamples=0; + filePara.numberSamples = 0; // filePara.sd=-1; wavFile->closeFile(); filePara.fd=0; - if(wavFile->isTempFile()) { + if( wavFile->isTempFile()) { // move tmp file to regular file QString cmd; cmd.sprintf("mv "+ wavFile->trackName() + " " + wavFile->currentFileName); - // qDebug("moving tmp file to "+currentFileName); - system(cmd.latin1()); +// qDebug("moving tmp file to "+currentFileName); + system( cmd.latin1()); } - - // qDebug("Just moved "+wavFile->currentFileName); + + qDebug("Just moved " + wavFile->currentFileName); Config cfg("OpieRec"); cfg.setGroup("Sounds"); int nFiles = cfg.readNumEntry( "NumberofFiles",0); - currentFile = QFileInfo(wavFile->currentFileName).fileName(); - currentFile=currentFile.left(currentFile.length()-4); + 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( "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 ); - // qDebug("writing config numberOfRecordedSeconds "+time); +// qDebug("writing config numberOfRecordedSeconds "+time); cfg.write(); - // qDebug("finished recording"); + qDebug("finished recording"); timeLabel->setText(""); } if(soundDevice) delete soundDevice; + timeSlider->setValue(0); initIconView(); - selectItemByName(currentFile); + selectItemByName( currentFile); } void QtRec::endPlaying() { + monitoring = false; + recording = false; + playing = false; + stopped = true; + waveform->reset(); +// errorStop(); +// qDebug("end playing"); + setRecordButton( false); - // qDebug("end playing"); - setRecordButton(false); - - toBeginningButton->setEnabled(true); - toEndButton->setEnabled(true); + toBeginningButton->setEnabled( true); + toEndButton->setEnabled( true); if(autoMute) - doMute(true); + doMute( true); soundDevice->closeDevice( false); - soundDevice->sd=-1; + soundDevice->sd = -1; // if(soundDevice) delete soundDevice; - // qDebug("file and sound device closed"); - stopped=true; - recording=false; - playing=false; +// qDebug("file and sound device closed"); timeLabel->setText(""); - monitoring=false; total = 0; - filePara.numberSamples=0; - filePara.sd=-1; - wavFile->closeFile(); - filePara.fd=0; + filePara.numberSamples = 0; + filePara.sd = -1; +// wavFile->closeFile(); + filePara.fd = 0; // if(wavFile) delete wavFile; //this crashes - // qDebug("track closed"); +// qDebug("track closed"); + killTimers(); + qWarning("reset slider"); timeSlider->setValue(0); if(soundDevice) delete soundDevice; @@ -1612,11 +1535,11 @@ bool QtRec::openPlayFile() { QString currentFileName; Config cfg("OpieRec"); cfg.setGroup("Sounds"); - int nFiles = cfg.readNumEntry("NumberofFiles",0); + 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, "" ); - // qDebug("opening for play: "+currentFileName); + currentFileName = cfg.readEntry( currentFile, "" ); + qDebug("opening for play: " + currentFileName); } } wavFile = new WavFile(this, @@ -1625,22 +1548,28 @@ bool QtRec::openPlayFile() { 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)*/ ); - QMessageBox::message(tr("Note"),tr("Could not open audio file.\n") - +errorMsg+"\n"+currentFile); + QString errorMsg = (QString)strerror(errno); + monitoring = false; + setCaption( tr( "OpieRecord " ) + QString::number(VERSION) ); + QMessageBox::message(tr("Note"), tr("Could not open audio file.\n") + + errorMsg + "\n" + currentFile); return false; } else { - filePara.numberSamples=wavFile->getNumberSamples(); + + filePara.numberSamples = wavFile->getNumberSamples(); filePara.format = wavFile->getFormat(); - // qDebug("file %d, samples %f", filePara.fd, filePara.numberSamples); - filePara.sampleRate= wavFile->getSampleRate(); - filePara.resolution=wavFile->getResolution(); + filePara.sampleRate = wavFile->getSampleRate(); + filePara.resolution = wavFile->getResolution(); + filePara.channels = wavFile->getChannels(); timeSlider->setPageStep(1); - monitoring=true; + monitoring = true; + + qDebug("file %d, samples %d %d", filePara.fd, filePara.numberSamples, filePara.sampleRate); + int sec = (int) (( filePara.numberSamples / filePara.sampleRate) / filePara.channels) / ( filePara.channels*( filePara.resolution/8)); + + qWarning("seconds %d", sec); + timeSlider->setRange(0, filePara.numberSamples ); - filePara.numberOfRecordedSeconds=(float) filePara.numberSamples / (float)filePara.sampleRate * (float)2; } return true; @@ -1651,11 +1580,11 @@ void QtRec::listPressed( int mouse, QListViewItem *item, const QPoint &, int ) { return; switch (mouse) { case 1: { - if( renameBox !=0 ) //tricky + if( renameBox != 0 ) //tricky cancelRename(); - currentFile=item->text(0); - setCaption( "OpieRecord "+currentFile); + currentFile = item->text(0); + setCaption( "OpieRecord " + currentFile); } break; case 2: @@ -1700,11 +1629,12 @@ void QtRec::doBeam() { 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) { + 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 ); + connect( file, SIGNAL( done(Ir*)), + this, SLOT( fileBeamFinished( Ir * ))); + file->send( filePath, "OPieRec audio file\n" + filePath ); } } } @@ -1738,8 +1668,7 @@ void QtRec::doRename() { } void QtRec::okRename() { - // qDebug("okRename"); - // qDebug(renameBox->text()); + qDebug(renameBox->text()); QString filename = renameBox->text(); cancelRename(); @@ -1751,7 +1680,7 @@ void QtRec::okRename() { QString file = ListView1->currentItem()->text(0); - // qDebug("filename is " + filename); + qDebug("filename is " + filename); int nFiles = cfg.readNumEntry("NumberofFiles",0); @@ -1762,7 +1691,7 @@ void QtRec::okRename() { cfg.writeEntry( QString::number(i), filename ); cfg.writeEntry( filename, filePath ); - cfg.removeEntry(file); + cfg.removeEntry( file); cfg.write(); } } @@ -1775,7 +1704,6 @@ void QtRec::okRename() { } void QtRec::cancelRename() { - // qDebug("cancel rename"); bool resetFocus = ListView1->viewport()->focusProxy() == renameBox; delete renameBox; renameBox = 0; @@ -1811,8 +1739,7 @@ int QtRec::getCurrentSizeLimit() { } void QtRec::timerBreak() { - // qDebug("timer break"); - stop(); + endPlaying(); } void QtRec::doVolMuting(bool b) { @@ -1836,15 +1763,16 @@ void QtRec::compressionSelected(bool b) { Config cfg("OpieRec"); cfg.setGroup("Settings"); cfg.writeEntry("wavCompression", b); - cfg.writeEntry("bitrate",16); filePara.resolution=16; + cfg.writeEntry("bitrate", 16); + filePara.resolution = 16; cfg.write(); if(b) { - bitRateComboBox->setEnabled(false); - bitRateComboBox->setCurrentItem(0); - filePara.resolution=16; + bitRateComboBox->setEnabled( false); + bitRateComboBox->setCurrentItem( 0); + filePara.resolution = 16; } else{ - bitRateComboBox->setEnabled(true); + bitRateComboBox->setEnabled( true); } } @@ -1878,48 +1806,48 @@ long QtRec::checkDiskSpace(const QString &path) { // char f_fname[6]; /* Volumename */ // char f_fpack[6]; /* Pack name */ -void QtRec::receive( const QCString &/* msg*/, const QByteArray & ) { - // qDebug("Voicerecord received message "+msg); +void QtRec::receive( const QCString &msg, const QByteArray & ) { + qDebug("Voicerecord received message "+msg); } ///////////////////////////// timerEvent void QtRec::timerEvent( QTimerEvent *e ) { -// qDebug( "%d", secCount ); + +// 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(); + } + + qDebug( "%d", secCount ); + QString timeString; #ifdef DEV_VERSION QString msg; msg.sprintf("%d, %d, %d", filePara.sampleRate, filePara.channels, filePara.resolution); setCaption( msg +" :: "+QString::number(secCount)); #endif - if( !playing ) { - if(!recording ){ - killTimer(e->timerId()); -///* stopped=true; -// recording=false; -///*/ -// _exit( 0); - } - if(filePara.SecondsToRecord < secCount && filePara.SecondsToRecord !=0) { - killTimer(e->timerId()); - stop(); - } - } -// if( stopped && !paused) { -// if( filePara.numberOfRecordedSeconds < secCount) { -// stopped = true; -// // playing=false; -// killTimer(e->timerId()); -// endPlaying(); -// } -// } -// qApp->processEvents(); + timeString.sprintf("%d", secCount); + timeLabel->setText( timeString + " seconds"); + secCount++; } void QtRec::changeTimeSlider(int index) { - if(ListView1->currentItem() == 0 || !wavFile->track.isOpen()) return; + if( ListView1->currentItem() == 0 || !wavFile->track.isOpen()) return; // qDebug("Slider moved to %d",index); paused = true; stopped = true; @@ -1927,34 +1855,34 @@ void QtRec::changeTimeSlider(int index) { sliderPos=index; QString timeString; - filePara.numberOfRecordedSeconds=(float)sliderPos/(float)filePara.sampleRate*(float)2; + filePara.numberOfRecordedSeconds = (float)sliderPos / (float)filePara.sampleRate * (float)2; timeString.sprintf( "%.2f", filePara.numberOfRecordedSeconds); secCount = (int)filePara.numberOfRecordedSeconds; - timeLabel->setText( timeString+ tr(" seconds")); + timeLabel->setText( timeString + tr(" seconds")); } void QtRec::timeSliderPressed() { - if(ListView1->currentItem() == 0) return; + if( ListView1->currentItem() == 0) return; // qDebug("slider pressed"); paused = true; stopped = true; } void QtRec::timeSliderReleased() { - if(ListView1->currentItem() == 0) return; - sliderPos=timeSlider->value(); + if( ListView1->currentItem() == 0) return; + sliderPos = timeSlider->value(); // qDebug("slider released %d", sliderPos); stopped = false; int newPos = lseek( filePara.fd, sliderPos, SEEK_SET); total = newPos*4; - filePara.numberOfRecordedSeconds=(float)sliderPos/(float)filePara.sampleRate*(float)2; + filePara.numberOfRecordedSeconds = (float)sliderPos / (float)filePara.sampleRate * (float)2; doPlay(); } void QtRec::rewindPressed() { - if(ListView1->currentItem() == 0) return; + if( ListView1->currentItem() == 0) return; if( !wavFile->track.isOpen()) { if( !openPlayFile() ) return; @@ -1965,18 +1893,18 @@ void QtRec::rewindPressed() { killTimers(); paused = true; stopped = true; - rewindTimer->start(50, false); + rewindTimer->start( 50, false); } } void QtRec::rewindTimerTimeout() { int sliderValue = timeSlider->value(); - sliderValue = sliderValue-(filePara.numberSamples/100); + sliderValue = sliderValue - ( filePara.numberSamples / 100); // if(toBeginningButton->isDown()) timeSlider->setValue( sliderValue ) ; // qDebug("%d", sliderValue); QString timeString; - filePara.numberOfRecordedSeconds=(float)sliderValue/(float)filePara.sampleRate*(float)2; + filePara.numberOfRecordedSeconds = (float)sliderValue / (float)filePara.sampleRate * (float)2; timeString.sprintf( "%.2f", filePara.numberOfRecordedSeconds); timeLabel->setText( timeString+ tr(" seconds")); } @@ -1987,15 +1915,15 @@ void QtRec::rewindReleased() { sliderPos=timeSlider->value(); stopped = false; int newPos = lseek( filePara.fd, sliderPos, SEEK_SET); - total = newPos*4; + total = newPos * 4; // qDebug("rewind released %d", total); - startTimer(1000); + startTimer( 1000); doPlay(); } } void QtRec::FastforwardPressed() { - if(ListView1->currentItem() == 0) return; + if( ListView1->currentItem() == 0) return; if( !wavFile->track.isOpen()) if( !openPlayFile() ) return; @@ -2012,13 +1940,13 @@ void QtRec::FastforwardPressed() { void QtRec::forwardTimerTimeout() { int sliderValue = timeSlider->value(); - sliderValue = sliderValue +(filePara.numberSamples/100); + sliderValue = sliderValue + ( filePara.numberSamples / 100); // if(toEndButton->isDown()) - timeSlider->setValue(sliderValue); + timeSlider->setValue( sliderValue); QString timeString; - filePara.numberOfRecordedSeconds=(float)sliderValue/(float)filePara.sampleRate*(float)2; + filePara.numberOfRecordedSeconds = (float)sliderValue / (float)filePara.sampleRate * (float)2; timeString.sprintf( "%.2f", filePara.numberOfRecordedSeconds); timeLabel->setText( timeString+ tr(" seconds")); } @@ -2029,9 +1957,9 @@ void QtRec::FastforwardReleased() { 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); + total = newPos * 4; + filePara.numberOfRecordedSeconds = (float)sliderPos / (float)filePara.sampleRate * (float)2; + startTimer( 1000); doPlay(); } } @@ -2044,11 +1972,11 @@ QString QtRec::getStorage(const QString &fileName) { 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 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); @@ -2071,20 +1999,20 @@ void QtRec::setRecordButton(bool b) { if(b) { //about to record or play - Rec_PushButton->setDown(true); + 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") ); + 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") ); + Stop_PushButton->setDown( false); + playLabel2->setText( tr("Play") ); if(Rec_PushButton->isDown()) Rec_PushButton->setDown( false); } @@ -2093,21 +2021,21 @@ void QtRec::setRecordButton(bool b) { void QtRec::fillDirectoryCombo() { if( directoryComboBox->count() > 0) directoryComboBox->clear(); - int index=0; + int index = 0; Config cfg("OpieRec"); cfg.setGroup("Settings"); - QString dir= cfg.readEntry("directory", "/"); + 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(); + const QString name = ( *it)->name(); + const QString path = ( *it)->path(); // directoryComboBox->insertItem(name+" "+path); directoryComboBox->insertItem(name); - if(path==dir) - directoryComboBox->setCurrentItem(index); + if( path == dir) + directoryComboBox->setCurrentItem( index); index++; } } @@ -2124,11 +2052,11 @@ void QtRec::doMute(bool b) { } void QtRec::slotAutoMute(bool b) { - autoMute=b; + autoMute = b; Config cfg("OpieRec"); cfg.setGroup("Settings"); cfg.writeEntry("useAutoMute",b); - doMute(b); + doMute( b); outMuteCheckBox->setChecked( b); inMuteCheckBox->setChecked( b); } @@ -2136,33 +2064,46 @@ void QtRec::slotAutoMute(bool b) { void QtRec::selectItemByName(const QString & name) { QListViewItemIterator it( ListView1 ); for ( ; it.current(); ++it ) - if(name == it.current()->text(0)) + 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 - float output = 0.0; - float halfLife = .25; - 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; - } +// 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; +// } - return (long)output; +void QtRec::changeStereoCheck(bool b) { + Config cfg("OpieRec"); + cfg.setGroup("Settings"); + int ch = 0; + if ( !b) { ch = 1;} + else { ch = 2;} + cfg.writeEntry("stereo", b); + filePara.channels = ch; + + cfg.write(); } + diff --git a/noncore/multimedia/opierec/qtrec.h b/noncore/multimedia/opierec/qtrec.h index ada3270..93b9b5f 100644 --- a/noncore/multimedia/opierec/qtrec.h +++ b/noncore/multimedia/opierec/qtrec.h @@ -4,7 +4,7 @@ copyright 2002 by L.J. Potter ljp@llornkcor.com ****************************************************************************/ #ifndef QTREC_H #define QTREC_H -#define VERSION 1.0 +#define VERSION 20030920 #include <qpe/ir.h> @@ -55,7 +55,7 @@ class QtRec : public QWidget Q_OBJECT public: - static QString appName() { return QString::fromLatin1("opierec"); } + static QString appName() { return QString::fromLatin1("opierec"); } QtRec( QWidget* parent=0, const char* name=0, WFlags fl=0 ); ~QtRec(); QSlider *OutputSlider,*InputSlider; @@ -72,7 +72,7 @@ private: QString currentFile; QString date, currentFileName, tmpFileName; QTimer *t_timer; - bool needsStereoOut, paused, playing; + bool needsStereoOut, paused; bool useTmpFile, autoMute; bool eventFilter( QObject * , QEvent * ); @@ -98,13 +98,14 @@ private: private slots: - void FastforwardPressed(); void FastforwardReleased(); void changeDirCombo(int); void changeSizeLimitCombo(int); void changeTimeSlider(int); void changebitrateCombo(int); + void changeStereoCheck( bool); + void changedInVolume(); void changedOutVolume(); void changesamplerateCombo(int); @@ -134,11 +135,9 @@ private slots: protected: - Device *soundDevice; WavFile *wavFile; - QButtonGroup *ButtonGroup1; - QCheckBox *outMuteCheckBox, *inMuteCheckBox, *compressionCheckBox, *autoMuteCheckBox; + QCheckBox *outMuteCheckBox, *inMuteCheckBox, *compressionCheckBox, *autoMuteCheckBox, *stereoCheckBox; QComboBox* sampleRateComboBox, * bitRateComboBox, *directoryComboBox, *sizeLimitCombo; QHBoxLayout* Layout12; QHBoxLayout* Layout13; @@ -178,7 +177,7 @@ protected: void keyReleaseEvent( QKeyEvent *e); void receive( const QCString &, const QByteArray & ); void showListMenu(QListViewItem * ); -// void quickRec(); +// void quickRec(); }; diff --git a/noncore/multimedia/opierec/wavFile.cpp b/noncore/multimedia/opierec/wavFile.cpp index b177c91..987fa32 100644 --- a/noncore/multimedia/opierec/wavFile.cpp +++ b/noncore/multimedia/opierec/wavFile.cpp @@ -149,8 +149,8 @@ bool WavFile::setWavHeader(int fd, wavhdr *hdr) { strncpy((*hdr).dataID, "data", 4); write( fd,hdr, sizeof(*hdr)); -// qDebug("writing header: bitrate%d, samplerate %d, channels %d", -// wavResolution, wavSampleRate, wavChannels); + qDebug("writing header: bitrate%d, samplerate %d, channels %d", + wavResolution, wavSampleRate, wavChannels); return true; } @@ -160,12 +160,12 @@ bool WavFile::adjustHeaders(int fd, int total) { write( fd, &i, sizeof(i)); lseek( fd, 40, SEEK_SET); write( fd, &total, sizeof(total)); -// qDebug("adjusting header %d", total); + qDebug("adjusting header %d", total); return true; } int WavFile::parseWavHeader(int fd) { -// qDebug("Parsing wav header"); + qDebug("Parsing wav header"); char string[4]; int found; short fmt; @@ -294,13 +294,18 @@ return wavResolution; } int WavFile::getSampleRate() { -return wavSampleRate; + return wavSampleRate; } int WavFile::getNumberSamples() { -return wavNumberSamples; + return wavNumberSamples; } bool WavFile::isTempFile() { return useTmpFile; } + +int WavFile::getChannels() { + + return wavChannels; +} diff --git a/noncore/multimedia/opierec/wavFile.h b/noncore/multimedia/opierec/wavFile.h index b70c09d..e18cfce 100644 --- a/noncore/multimedia/opierec/wavFile.h +++ b/noncore/multimedia/opierec/wavFile.h @@ -41,6 +41,7 @@ public: int getResolution(); int getSampleRate(); int getNumberSamples(); + int getChannels(); bool isTempFile(); int openFile(const QString &); bool newFile(); |