Main Page | Namespace List | Class Hierarchy | Alphabetical List | Class List | Directories | File List | Namespace Members | Class Members | File Members | Related Pages

device.cpp

Go to the documentation of this file.
00001 // device.cpp
00002 
00003 #include "device.h"
00004 
00005 #include <qpe/config.h>
00006 #include <qpe/qcopenvelope_qws.h>
00007 
00008 #include <opie2/odebug.h>
00009 
00010 /* STD */
00011 #include <fcntl.h>
00012 #include <stdio.h>
00013 #include <stdlib.h>
00014 #include <sys/ioctl.h>
00015 #include <sys/soundcard.h>
00016 #include <unistd.h>
00017 #include <sys/wait.h>
00018 #include <unistd.h>
00019 #include <errno.h>
00020 
00021 //extern QtRec *qperec;
00022 #if defined(QT_QWS_SL5XXX)
00023 
00024 
00025 #define DSPSTROUT "/dev/dsp"
00026 #define DSPSTRMIXEROUT "/dev/mixer"
00027 
00028 #ifdef SHARP
00029 #define DSPSTRIN "/dev/dsp1"
00030 #define DSPSTRMIXERIN "/dev/mixer1"
00031 #else
00032 #define DSPSTRIN "/dev/dsp"
00033 #define DSPSTRMIXERIN "/dev/mixer"
00034 #endif
00035 
00036 #else
00037 
00038 #ifdef QT_QWS_DEVFS
00039 #define DSPSTROUT "/dev/sound/dsp"
00040 #define DSPSTRIN "/dev/sound/dsp"
00041 #define DSPSTRMIXERIN "/dev/sound/mixer"
00042 #define DSPSTRMIXEROUT "/dev/sound/mixer"
00043 #else
00044 #define DSPSTROUT "/dev/dsp"
00045 #define DSPSTRIN "/dev/dsp"
00046 #define DSPSTRMIXERIN "/dev/mixer"
00047 #define DSPSTRMIXEROUT "/dev/mixer"
00048 #endif
00049 
00050 #endif
00051 
00052 Device::Device( QObject * parent, bool record )
00053         : QObject( parent)
00054 {
00055 //    dspstr = dsp;
00056     devForm = -1;
00057     devCh = -1;
00058     devRate = -1;
00059 
00060     if( !record){ //playing
00061         owarn << "New Sound device DSP for playing" << oendl;
00062         flags = O_RDWR;
00063 //        flags = O_WRONLY;
00064     } else { //recording
00065         owarn << "New Sound device DSP for recording" << oendl;
00066         flags = O_RDWR;
00067 //        flags = O_RDONLY;
00068                                 selectMicInput();
00069     }
00070 }
00071 
00072 bool Device::openDsp() {
00073                 qWarning("Device::openDsp()");
00074     if( openDevice( flags) == -1) {
00075         perror("<<<<<<<<<<<<<<ioctl(\"Open device\")");
00076         return false;
00077     }
00078     return true;
00079 }
00080 
00081 int Device::openDevice( int flags) {
00082                 owarn << "Opening sound device:"<< DSPSTROUT << oendl;
00083 
00084                 if (( sd = ::open( DSPSTROUT, O_RDWR)) == -1) {
00085                                 perror("open(\"/dev/dsp\")\n");
00086                                 QString errorMsg="Could not open audio device\n /dev/dsp\n"
00087                                                 +(QString)strerror(errno);
00088                                 qDebug( "XXXXXXXXXXXXXXXXXXXXXXX  "+errorMsg );
00089                                 return -1;
00090                 }
00091 
00092                 if(ioctl(sd,SNDCTL_DSP_RESET,0)<0){
00093                                 perror("ioctl RESET");
00094                 }
00095                 qWarning("opened!");
00096     return sd;
00097 }
00098 
00099 int Device::getInVolume() {
00100     unsigned int volume = 0;
00101     Config cfg("qpe");
00102     cfg.setGroup("Volume");
00103 
00104     return cfg.readNumEntry("Mic");
00105 }
00106 
00107 int Device::getOutVolume( ) {
00108     unsigned int volume;
00109     Config cfg("qpe");
00110     cfg.setGroup("Volume");
00111 
00112     return cfg.readNumEntry("VolumePercent");
00113 }
00114 
00115 
00116 void Device::changedInVolume(int vol ) {
00117                 Config cfg("qpe");
00118                 cfg.setGroup("Volume");
00119                 cfg.writeEntry("Mic", QString::number(vol ));
00120                 QCopEnvelope( "QPE/System", "micChange(bool)" ) << false;
00121 }
00122 
00123 void Device::changedOutVolume(int vol) {
00124                 Config cfg("qpe");
00125                 cfg.setGroup("Volume");
00126                 cfg.writeEntry("VolumePercent", QString::number( vol ));
00127 
00128                 QCopEnvelope( "QPE/System", "volumeChange(bool)" ) << false;
00129 
00130                 owarn << "changing output vol " << vol << oendl;
00131 }
00132 
00133 bool Device::selectMicInput() {
00134 
00135                 int md = 0;
00136                 int info = SOUND_MASK_MIC;//MIXER_WRITE(SOUND_MIXER_MIC);
00137                 owarn << "sectMicInput" << oendl;
00138                 md = ::open( DSPSTRMIXEROUT, O_RDWR );
00139 
00140                 if ( md <= 0) {
00141                                 QString err;
00142                                 err.sprintf("open %s", DSPSTRMIXEROUT);
00143                                 perror(err.latin1());
00144                 } else {
00145                                 if( ioctl( md, SOUND_MIXER_WRITE_RECSRC, &info) == -1)
00146                                                 perror("ioctl(\"SOUND_MIXER_WRITE_RECSRC\")");
00147                                 ::close(md);
00148                                 return false;
00149                 }
00150                 ::close(md);
00151 
00152     return true;
00153 }
00154 
00155 bool Device::closeDevice( bool) {
00156                 if(sd)
00157     ::close( sd); //close sound device
00158     return true;
00159 }
00160 
00161 bool Device::setDeviceFormat( int form) {
00162     qDebug( "set device res %d: %d ",form, sd );
00163     if (ioctl( sd, SNDCTL_DSP_SETFMT,  &form)==-1) { //set format
00164         perror("ioctl(\"SNDCTL_DSP_SETFMT\")");
00165         return false;
00166     }
00167     devRes=form;
00168     return true;
00169 }
00170 
00171 bool Device::setDeviceChannels( int ch) {
00172     qDebug( "set channels %d: %d",ch ,sd);
00173     if (ioctl( sd, SNDCTL_DSP_CHANNELS, &ch)==-1) {
00174         perror("ioctl(\"SNDCTL_DSP_CHANNELS\")");
00175         return false;
00176     }
00177     devCh=ch;
00178     return true;
00179 }
00180 
00181 bool Device::setDeviceRate( int rate) {
00182     qDebug( "set rate %d: %d",rate,sd);
00183     if (ioctl( sd, SNDCTL_DSP_SPEED, &rate) == -1) {
00184         perror("ioctl(\"SNDCTL_DSP_SPEED\")");
00185         return false;
00186     }
00187 
00188     devRate=rate;
00189 
00190     return true;
00191 }
00192 
00193 int Device::getRes() {
00194     return devRes;
00195 }
00196 
00197 int Device::getFormat() {
00198     return devForm;
00199 }
00200 
00201 int Device::getRate() {
00202     return devRate;
00203 }
00204 
00205 int Device::getChannels() {
00206     return devCh;
00207 }
00208 
00209 int Device::getDeviceFormat() {
00210     return 0;
00211 }
00212 
00213 
00214 int Device::getDeviceRate() {
00215     int dRate = 0;
00216     if (ioctl( sd, SOUND_PCM_READ_RATE, &dRate) == -1) {
00217         perror("ioctl(\"SNDCTL_PCM_READ_RATE\")");
00218     }
00219     return dRate;
00220 
00221 }
00222 
00223 int Device::getDeviceBits() {
00224     int dBits = 0;
00225      if (ioctl( sd, SOUND_PCM_READ_BITS, &dBits) == -1) {
00226          perror("ioctl(\"SNDCTL_PCM_READ_BITS\")");
00227      }
00228     return dBits;
00229 }
00230 
00231 int Device::getDeviceChannels() {
00232     int dCh = 0;
00233     if (ioctl( sd, SOUND_PCM_READ_CHANNELS, &dCh) == -1) {
00234         perror("ioctl(\"SNDCTL_PCM_READ_CHANNELS\")");
00235     }
00236     return dCh;
00237 }
00238 
00239 int Device::getDeviceFragSize() {
00240     int frag_size;
00241 
00242     if (ioctl( sd, SNDCTL_DSP_GETBLKSIZE, &frag_size) == -1) {
00243       qDebug( "no fragsize" );
00244     } else {
00245       qDebug( "driver says frag size is %d",frag_size);
00246     }
00247     return frag_size;
00248 }
00249 
00250 bool Device::setFragSize(int frag) {
00251     if (ioctl(sd, SNDCTL_DSP_SETFRAGMENT, &frag)) {
00252         perror("ioctl(\"SNDCTL_DSP_SETFRAGMENT\")");
00253         return false;
00254     }
00255     return true;
00256 }
00257 
00258 bool Device::reset() {
00259   closeDevice(true);
00260   openDsp();
00261          if (ioctl( sd, SNDCTL_DSP_RESET, 0) == -1) {
00262              perror("ioctl(\"SNDCTL_DSP_RESET\")");
00263        return false;
00264          }
00265    return true;
00266 }
00267 
00268 int Device::devRead(int soundDescriptor, short *buf, int size) {
00269                 Q_UNUSED(soundDescriptor);
00270                 int number = 0;
00271                 number = ::read(  sd /*soundDescriptor*/, (char *)buf, size);
00272                 return number;
00273 }
00274 
00275 int Device::devWrite(int soundDescriptor, short * buf, int size) {
00276                 Q_UNUSED(soundDescriptor);
00277                 int bytesWritten = 0;
00278                 bytesWritten = ::write( sd /*soundDescriptor*/, buf, size);
00279                 return bytesWritten;
00280 }

Generated on Sat Nov 5 16:17:34 2005 for OPIE by  doxygen 1.4.2