-rw-r--r-- | noncore/multimedia/opierec/device.cpp | 51 | ||||
-rw-r--r-- | noncore/multimedia/opierec/device.h | 3 | ||||
-rw-r--r-- | noncore/multimedia/opierec/main.cpp | 3 | ||||
-rw-r--r-- | noncore/multimedia/opierec/opierec.control | 2 | ||||
-rw-r--r-- | noncore/multimedia/opierec/opierec.pro | 23 | ||||
-rw-r--r-- | noncore/multimedia/opierec/qtrec.cpp | 983 | ||||
-rw-r--r-- | noncore/multimedia/opierec/qtrec.h | 11 | ||||
-rw-r--r-- | noncore/multimedia/opierec/wavFile.cpp | 13 | ||||
-rw-r--r-- | noncore/multimedia/opierec/wavFile.h | 1 |
9 files changed, 540 insertions, 550 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> @@ -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: { */ +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){ @@ -203,12 +211,12 @@ exit(1); // 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\")"); } @@ -311,8 +319,9 @@ int Device::getDeviceFragSize() { 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 @@ -31,6 +31,9 @@ public: 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; 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 @@ -14,3 +14,6 @@ #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 = 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> @@ -58,13 +56,27 @@ extern "C" { #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,56 +97,47 @@ 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; + QString num; 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); +// qDebug("bits %d", bits); if( filePara.resolution == 16 ) { //AFMT_S16_LE) +// qDebug("AFMT_S16_LE size %d", filePara.SecondsToRecord); +// qDebug("samples to record %d", filePara.samplesToRecord); +// qDebug("%d", filePara.sd); 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"); + // <<<<<<<<<<<<<<<<<<<<<<<<<<< WAVE_FORMAT_DVI_ADPCM >>>>>>>>>>>>>>>>>>>>>> char abuf[BUFSIZE/2]; short sbuf[BUFSIZE]; short sbuf2[BUFSIZE]; @@ -144,104 +147,88 @@ void quickRec() { for(;;) { if (stopped) { - break; // stop if playing was set to false + 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"); + // <<<<<<<<<<<<<<<<<<<<<<<<<<< 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) { + qDebug("quickRec:: stopped"); + stopped = true; break; // stop if playing was set to false + return; } - number=::read( filePara.sd, inbuffer, BUFSIZE); + number = soundDevice ->devRead( filePara.sd, (short *)inbuffer, BUFSIZE); + waveform->newSamples( inbuffer, number ); + if(number <= 0) { perror("recording error "); - recording=stopped=false; - // errorStop(); - return;// false; + 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 + + bytesWritten = soundDevice->devWrite( filePara.fd , inbuffer, number); + if(bytesWritten < 0) { - // errorStop(); 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) 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; @@ -251,36 +238,20 @@ outbuffer[i]=inbuffer[i]>>1; // no clippy, please for(;;) { if (stopped) { - // qDebug("quickRec:: 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); @@ -290,29 +261,151 @@ outbuffer[i]=inbuffer[i]>>1; // no clippy, please 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(); @@ -363,8 +456,6 @@ void QtRec::cleanUp() { if(wavFile) delete wavFile; // if(soundDevice) delete soundDevice; -// QPEApplication::grabKeyboard(); -// QPEApplication::ungrabKeyboard(); } void QtRec::init() { @@ -392,9 +483,7 @@ 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); @@ -434,10 +523,12 @@ void QtRec::init() { 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); @@ -467,20 +558,10 @@ void QtRec::init() { ///**********<<<<<<<<<<<<>>>>>>>>>>>>*************** 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,7 +579,7 @@ 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" ) ); @@ -507,24 +588,13 @@ void QtRec::init() { 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(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); @@ -532,7 +602,7 @@ void QtRec::init() { 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" ) ); @@ -543,22 +613,21 @@ void QtRec::init() { 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(); - - if( width < height) { tab_5 = new QWidget( TabWidget, "tab_5" ); @@ -568,7 +637,6 @@ void QtRec::init() { Layout19a->setSpacing( 2 ); Layout19a->setMargin( 0 ); - Layout15 = new QVBoxLayout(this); Layout15->setSpacing( 2 ); Layout15->setMargin( 0 ); @@ -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,8 +743,9 @@ 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; @@ -708,7 +754,6 @@ void QtRec::initIconView() { temp.sprintf("%d",i); temp=cfg.readEntry(temp,""); //reads currentFile filePath = cfg.readEntry(temp,""); //currentFileName - // qDebug(filePath); QFileInfo info(filePath); fileDate = info.lastModified().toString(); @@ -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() { @@ -782,13 +852,15 @@ void QtRec::initConfig() { 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() { @@ -853,6 +920,9 @@ void QtRec::start() { //play } bool QtRec::rec() { //record + QString timeString; + timeString.sprintf("%.0f", 0.0); + timeLabel->setText( timeString+ " seconds"); if(!stopped) { monitoring=true; return false; @@ -861,34 +931,47 @@ bool QtRec::rec() { //record playLabel2->setText(tr("Stop")); monitoring=false; setRecordButton(true); - stopped=false; if( setupAudio( true)) if(setUpFile()) { 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); 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) { +// qDebug("WAVE_FORMAT_PCM"); fileSize = (filePara.SecondsToRecord ) * filePara.channels * 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.samplesToRecord = fileSize; + 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,6 +987,8 @@ 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/* &*/); @@ -911,28 +996,10 @@ bool QtRec::rec() { //record 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; } /* @@ -941,8 +1008,8 @@ void QtRec::thisTab(QWidget* widg) { if(widg != NULL) { int index=TabWidget->currentPageIndex(); -// if(index==0) { //file page -// } + if(index == 0) { //file page + } if(index ==1) { //control page fillDirectoryCombo(); @@ -950,8 +1017,9 @@ void QtRec::thisTab(QWidget* widg) { // soundDevice->getInVol(); } -// if(index==2) { //help page -// } + if( index==2) { //help page + } + qApp->processEvents(); update(); } @@ -959,11 +1027,13 @@ 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); } @@ -983,7 +1053,8 @@ 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; @@ -992,10 +1063,11 @@ bool QtRec::setupAudio( bool b) { filePara.resolution=8; } - stereo = filePara.channels = 1; + stereo = filePara.channels; flags= O_WRONLY; dspString = DSPSTROUT; mixerString = DSPSTRMIXEROUT; + recording = false; } else { // we want to record if( !bitRateComboBox->isEnabled() || bitRateComboBox->currentText() == "16") @@ -1005,22 +1077,34 @@ bool QtRec::setupAudio( bool b) { if( !compressionCheckBox->isChecked()) { filePara.format=WAVE_FORMAT_PCM; +// qDebug("WAVE_FORMAT_PCM"); } else { 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; update(); - setCaption( tr( "OpieRecord " ) /*+ QString::number(VERSION)*/ ); - stopped=true; + setCaption( tr( "OpieRecord " )+ QString::number(VERSION) ); return false; } if(autoMute) @@ -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; filePara.numberOfRecordedSeconds = 0; } else { paused = false; secCount = (int)filePara.numberOfRecordedSeconds; } playing=true; - number=0; + 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); + pthread_t thread2; + pthread_create( &thread2, NULL, (void * (*)(void *))playIt, NULL/* &*/); - 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; - - timeSlider->setValue( total); - - 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); - } - } + toBeginningButton->setEnabled( false); + toEndButton->setEnabled( false); -// qDebug("\nstopped or paused %d", total/4); - if(!paused && !stopped) { - stopped = true; -// endPlaying(); - endPlaying(); - } return true; } @@ -1250,19 +1212,8 @@ void QtRec::changesamplerateCombo(int i) { rate = sampleRateComboBox->text(i).toInt(&ok, 10); 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(); - } @@ -1281,7 +1232,7 @@ void QtRec::changeDirCombo(int index) { const QString path = (*it)->path(); recDir = path; cfg.writeEntry("directory", recDir); - // qDebug("new rec dir "+recDir); + qDebug("new rec dir "+recDir); } } cfg.write(); @@ -1296,14 +1247,10 @@ void QtRec::changeSizeLimitCombo(int) { } void QtRec::newSound() { - // qDebug("<<<<<<<<<new sound"); - if( !rec()) { - // qDebug("rec() failed"); endRecording(); deleteSound(); } - } void QtRec::itClick(QListViewItem *item) { @@ -1324,11 +1271,9 @@ 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()) if( !f.remove()) QMessageBox::message(tr("Error"),tr("Could not remove file.")); @@ -1336,11 +1281,9 @@ void QtRec::deleteSound() { 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) @@ -1349,12 +1292,10 @@ void QtRec::deleteSound() { cfg.removeEntry(cfg.readEntry(file)); cfg.removeEntry( file); - // cfg.removeEntry( QString::number(nFiles)); cfg.writeEntry("NumberofFiles", nFiles-1); cfg.write(); ListView1->takeItem( ListView1->currentItem() ); - // ListView1->takeItem( ListView1->itemAt(nFiles) ); delete ListView1->currentItem(); ListView1->clear(); @@ -1365,32 +1306,13 @@ void QtRec::deleteSound() { #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,25 +1414,26 @@ 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"); + monitoring = false; + recording = false; + stopped = true; + waveform->reset(); setRecordButton(false); - timeSlider->setValue(0); + toBeginningButton->setEnabled(true); toEndButton->setEnabled(true); - monitoring=false; - killTimers(); if(autoMute) @@ -1518,10 +1441,6 @@ void QtRec::endRecording() { soundDevice->closeDevice( true); - recording = false; - stopped=true; - t->stop(); - if( wavFile->track.isOpen()) { wavFile->adjustHeaders( filePara.fd, filePara.numberSamples); // soundDevice->sd=-1; @@ -1538,7 +1457,7 @@ void QtRec::endRecording() { system(cmd.latin1()); } - // qDebug("Just moved "+wavFile->currentFileName); + qDebug("Just moved " + wavFile->currentFileName); Config cfg("OpieRec"); cfg.setGroup("Sounds"); @@ -1557,18 +1476,24 @@ void QtRec::endRecording() { // 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); } void QtRec::endPlaying() { - + monitoring = false; + recording = false; + playing = false; + stopped = true; + waveform->reset(); +// errorStop(); // qDebug("end playing"); setRecordButton(false); @@ -1582,19 +1507,17 @@ void QtRec::endPlaying() { soundDevice->sd=-1; // if(soundDevice) delete soundDevice; // qDebug("file and sound device closed"); - stopped=true; - recording=false; - playing=false; timeLabel->setText(""); - monitoring=false; total = 0; filePara.numberSamples=0; filePara.sd=-1; - wavFile->closeFile(); +// wavFile->closeFile(); filePara.fd=0; // if(wavFile) delete wavFile; //this crashes // qDebug("track closed"); + killTimers(); + qWarning("reset slider"); timeSlider->setValue(0); if(soundDevice) delete soundDevice; @@ -1616,7 +1539,7 @@ bool QtRec::openPlayFile() { 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); + qDebug("opening for play: " + currentFileName); } } wavFile = new WavFile(this, @@ -1627,20 +1550,26 @@ bool QtRec::openPlayFile() { // if(!track.open(IO_ReadOnly)) { QString errorMsg=(QString)strerror(errno); monitoring=false; - setCaption( tr( "OpieRecord " )/* + QString::number(VERSION)*/ ); + 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.format = wavFile->getFormat(); - // qDebug("file %d, samples %f", filePara.fd, filePara.numberSamples); filePara.sampleRate= wavFile->getSampleRate(); filePara.resolution=wavFile->getResolution(); + filePara.channels = wavFile->getChannels(); timeSlider->setPageStep(1); 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; @@ -1703,7 +1632,8 @@ void QtRec::doBeam() { 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 * ))); + 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); @@ -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,7 +1763,8 @@ 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) { @@ -1878,43 +1806,43 @@ 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++; } @@ -2141,28 +2069,41 @@ void QtRec::selectItemByName(const QString & name) { } -long findPeak(long input ) { +// 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; - } +// // 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> @@ -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; 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; @@ -304,3 +304,8 @@ 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(); |