00001
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
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
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
00056 devForm = -1;
00057 devCh = -1;
00058 devRate = -1;
00059
00060 if( !record){
00061 owarn << "New Sound device DSP for playing" << oendl;
00062 flags = O_RDWR;
00063
00064 } else {
00065 owarn << "New Sound device DSP for recording" << oendl;
00066 flags = O_RDWR;
00067
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;
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);
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) {
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 , (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 , buf, size);
00279 return bytesWritten;
00280 }