Diffstat (limited to 'noncore/multimedia/opierec/device.cpp') (more/less context) (show whitespace changes)
-rw-r--r-- | noncore/multimedia/opierec/device.cpp | 51 |
1 files changed, 37 insertions, 14 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 | |||
@@ -1,13 +1,13 @@ | |||
1 | // device.cpp | 1 | // device.cpp |
2 | 2 | ||
3 | #include "device.h" | 3 | #include "device.h" |
4 | 4 | ||
5 | #include <qpe/config.h> | 5 | #include <qpe/config.h> |
6 | #include <qpe/qcopenvelope_qws.h> | 6 | #include <qpe/qcopenvelope_qws.h> |
7 | #include <qpe/custom.h> | 7 | |
8 | 8 | ||
9 | #include <fcntl.h> | 9 | #include <fcntl.h> |
10 | #include <stdio.h> | 10 | #include <stdio.h> |
11 | #include <stdlib.h> | 11 | #include <stdlib.h> |
12 | #include <sys/ioctl.h> | 12 | #include <sys/ioctl.h> |
13 | #include <sys/soundcard.h> | 13 | #include <sys/soundcard.h> |
@@ -35,13 +35,15 @@ Device::Device( QObject * parent, const char * dsp, const char * mixr, bool reco | |||
35 | qDebug("setting up DSP for playing"); | 35 | qDebug("setting up DSP for playing"); |
36 | flags = O_WRONLY; | 36 | flags = O_WRONLY; |
37 | } else { //recording | 37 | } else { //recording |
38 | qDebug("setting up DSP for recording"); | 38 | qDebug("setting up DSP for recording"); |
39 | flags = O_RDWR; | 39 | flags = O_RDWR; |
40 | // flags = O_RDONLY; | 40 | // flags = O_RDONLY; |
41 | selectMicInput(); | 41 | |
42 | // selectMicInput(); | ||
43 | |||
42 | } | 44 | } |
43 | } | 45 | } |
44 | 46 | ||
45 | bool Device::openDsp() { | 47 | bool Device::openDsp() { |
46 | if( openDevice( flags) == -1) { | 48 | if( openDevice( flags) == -1) { |
47 | perror("<<<<<<<<<<<<<<ioctl(\"Open device\")"); | 49 | perror("<<<<<<<<<<<<<<ioctl(\"Open device\")"); |
@@ -91,12 +93,13 @@ void Device::changedOutVolume(int vol) { | |||
91 | perror("ioctl(\"MIXER_IN_WRITE\")"); | 93 | perror("ioctl(\"MIXER_IN_WRITE\")"); |
92 | 94 | ||
93 | Config cfg("qpe"); | 95 | Config cfg("qpe"); |
94 | cfg.setGroup("Volume"); | 96 | cfg.setGroup("Volume"); |
95 | cfg.writeEntry("VolumePercent", QString::number( vol )); | 97 | cfg.writeEntry("VolumePercent", QString::number( vol )); |
96 | QCopEnvelope( "QPE/System", "volumeChange(bool)" ) << false; | 98 | QCopEnvelope( "QPE/System", "volumeChange(bool)" ) << false; |
99 | qWarning("changing output vol %d", vol); | ||
97 | } | 100 | } |
98 | ::close(fd); | 101 | ::close(fd); |
99 | } | 102 | } |
100 | 103 | ||
101 | void Device::changedInVolume(int vol ) { | 104 | void Device::changedInVolume(int vol ) { |
102 | int level = (vol << 8) + vol; | 105 | int level = (vol << 8) + vol; |
@@ -105,31 +108,32 @@ void Device::changedInVolume(int vol ) { | |||
105 | if(ioctl(fd, MIXER_WRITE(SOUND_MIXER_MIC), &level) == -1) | 108 | if(ioctl(fd, MIXER_WRITE(SOUND_MIXER_MIC), &level) == -1) |
106 | perror("ioctl(\"MIXER_IN_WRITE\")"); | 109 | perror("ioctl(\"MIXER_IN_WRITE\")"); |
107 | Config cfg("qpe"); | 110 | Config cfg("qpe"); |
108 | cfg.setGroup("Volume"); | 111 | cfg.setGroup("Volume"); |
109 | cfg.writeEntry("Mic", QString::number(vol )); | 112 | cfg.writeEntry("Mic", QString::number(vol )); |
110 | QCopEnvelope( "QPE/System", "micChange(bool)" ) << false; | 113 | QCopEnvelope( "QPE/System", "micChange(bool)" ) << false; |
114 | qWarning("changing input volume %d", vol); | ||
111 | } | 115 | } |
112 | ::close(fd); | 116 | ::close(fd); |
113 | } | 117 | } |
114 | 118 | ||
115 | bool Device::selectMicInput() { | 119 | bool Device::selectMicInput() { |
116 | /* | 120 | |
117 | int md=0; | 121 | int md=0; |
118 | int info=MIXER_WRITE(SOUND_MIXER_MIC); | 122 | int info=MIXER_WRITE(SOUND_MIXER_MIC); |
119 | md = ::open( "/dev/mixer", O_RDWR ); | 123 | md = ::open( "/dev/mixer", O_RDWR ); |
120 | if ( md == -1) | 124 | if ( md == -1) |
121 | perror("open(\"/dev/mixer\")"); | 125 | perror("open(\"/dev/mixer\")"); |
122 | else { | 126 | else { |
123 | if( ioctl( md, SOUND_MIXER_WRITE_RECSRC, &info) == -1) | 127 | if( ioctl( md, SOUND_MIXER_WRITE_RECSRC, &info) == -1) |
124 | perror("ioctl(\"SOUND_MIXER_WRITE_RECSRC\")"); | 128 | perror("ioctl(\"SOUND_MIXER_WRITE_RECSRC\")"); |
125 | ::close(md); | 129 | ::close(md); |
126 | return false; | 130 | return false; |
127 | } | 131 | } |
128 | ::close(md); | 132 | ::close(md); |
129 | */ | 133 | |
130 | return true; | 134 | return true; |
131 | } | 135 | } |
132 | 136 | ||
133 | int Device::openDevice( int flags) { | 137 | int Device::openDevice( int flags) { |
134 | /* pid_t pid; | 138 | /* pid_t pid; |
135 | int status; | 139 | int status; |
@@ -142,24 +146,28 @@ exit(1); | |||
142 | switch (pid = fork()) { | 146 | switch (pid = fork()) { |
143 | case -1: | 147 | case -1: |
144 | perror("The fork failed!"); | 148 | perror("The fork failed!"); |
145 | break; | 149 | break; |
146 | case 0: { | 150 | case 0: { |
147 | */ | 151 | */ |
152 | qDebug("Opening %s",dspstr); | ||
148 | if (( sd = ::open( dspstr, flags)) == -1) { | 153 | if (( sd = ::open( dspstr, flags)) == -1) { |
149 | perror("open(\"/dev/dsp\")"); | 154 | perror("open(\"/dev/dsp\")"); |
150 | QString errorMsg="Could not open audio device\n /dev/dsp\n" | 155 | QString errorMsg="Could not open audio device\n /dev/dsp\n" |
151 | +(QString)strerror(errno); | 156 | +(QString)strerror(errno); |
152 | qDebug(errorMsg); | 157 | qDebug("XXXXXXXXXXXXXXXXXXXXXXX "+errorMsg); |
153 | return -1; | 158 | return -1; |
154 | } | 159 | } |
155 | 160 | ||
161 | qDebug("Opening mixer"); | ||
156 | int mixerHandle=0; | 162 | int mixerHandle=0; |
157 | /* Set the input dsp device and its input gain the weird Zaurus way */ | 163 | if (( mixerHandle = open("/dev/mixer",O_RDWR))<0) { |
158 | if (( mixerHandle = open("/dev/mixer1",O_RDWR))<0) { | 164 | perror("open(\"/dev/mixer\")"); |
159 | perror("open(\"/dev/mixer1\")"); | 165 | QString errorMsg="Could not open audio device\n /dev/dsp\n" |
166 | +(QString)strerror(errno); | ||
167 | qDebug("XXXXXXXXXXXXXXXXXXXXXX "+errorMsg); | ||
160 | } | 168 | } |
161 | 169 | ||
162 | if(ioctl(sd,SNDCTL_DSP_RESET,0)<0){ | 170 | if(ioctl(sd,SNDCTL_DSP_RESET,0)<0){ |
163 | perror("ioctl RESET"); | 171 | perror("ioctl RESET"); |
164 | } | 172 | } |
165 | // sprintf(message, "%d", sd); | 173 | // sprintf(message, "%d", sd); |
@@ -200,18 +208,18 @@ exit(1); | |||
200 | // sd = s.toInt(&ok, 10); | 208 | // sd = s.toInt(&ok, 10); |
201 | // qDebug("<<<<<<<<<<<<<>>>>>>>>>>>>"+s); | 209 | // qDebug("<<<<<<<<<<<<<>>>>>>>>>>>>"+s); |
202 | 210 | ||
203 | // f2.close(); | 211 | // f2.close(); |
204 | // } | 212 | // } |
205 | ::close(mixerHandle ); | 213 | ::close(mixerHandle ); |
206 | qDebug("open device %s", dspstr); | 214 | // qDebug("open device %s", dspstr); |
207 | qDebug("success! %d",sd); | 215 | // qDebug("success! %d",sd); |
208 | return sd; | 216 | return sd; |
209 | } | 217 | } |
210 | 218 | ||
211 | bool Device::closeDevice( bool b) { | 219 | bool Device::closeDevice( bool) { |
212 | // if(b) {//close now | 220 | // if(b) {//close now |
213 | // if (ioctl( sd, SNDCTL_DSP_RESET, 0) == -1) { | 221 | // if (ioctl( sd, SNDCTL_DSP_RESET, 0) == -1) { |
214 | // perror("ioctl(\"SNDCTL_DSP_RESET\")"); | 222 | // perror("ioctl(\"SNDCTL_DSP_RESET\")"); |
215 | // } | 223 | // } |
216 | // } else { //let play | 224 | // } else { //let play |
217 | // if (ioctl( sd, SNDCTL_DSP_SYNC, 0) == -1) { | 225 | // if (ioctl( sd, SNDCTL_DSP_SYNC, 0) == -1) { |
@@ -219,13 +227,13 @@ bool Device::closeDevice( bool b) { | |||
219 | // } | 227 | // } |
220 | // } | 228 | // } |
221 | 229 | ||
222 | ::close( sd); //close sound device | 230 | ::close( sd); //close sound device |
223 | // sdfd=0; | 231 | // sdfd=0; |
224 | // sd=0; | 232 | // sd=0; |
225 | qDebug("closed dsp"); | 233 | // qDebug("closed dsp"); |
226 | return true; | 234 | return true; |
227 | } | 235 | } |
228 | 236 | ||
229 | bool Device::setDeviceFormat( int form) { | 237 | bool Device::setDeviceFormat( int form) { |
230 | qDebug("set device res %d %d", form, sd); | 238 | qDebug("set device res %d %d", form, sd); |
231 | if (ioctl( sd, SNDCTL_DSP_SETFMT, &form)==-1) { //set format | 239 | if (ioctl( sd, SNDCTL_DSP_SETFMT, &form)==-1) { //set format |
@@ -287,13 +295,13 @@ int Device::getDeviceRate() { | |||
287 | return dRate; | 295 | return dRate; |
288 | 296 | ||
289 | } | 297 | } |
290 | 298 | ||
291 | int Device::getDeviceBits() { | 299 | int Device::getDeviceBits() { |
292 | int dBits=0; | 300 | int dBits=0; |
293 | #if !defined(OPIE_NO_SOUND_PCM_READ_BITS) // zaurus doesnt have this | 301 | #ifndef QT_QWS_EBX // zaurus doesnt have this |
294 | if (ioctl( sd, SOUND_PCM_READ_BITS, &dBits) == -1) { | 302 | if (ioctl( sd, SOUND_PCM_READ_BITS, &dBits) == -1) { |
295 | perror("ioctl(\"SNDCTL_PCM_READ_BITS\")"); | 303 | perror("ioctl(\"SNDCTL_PCM_READ_BITS\")"); |
296 | } | 304 | } |
297 | #endif | 305 | #endif |
298 | return dBits; | 306 | return dBits; |
299 | } | 307 | } |
@@ -308,14 +316,15 @@ int Device::getDeviceChannels() { | |||
308 | 316 | ||
309 | int Device::getDeviceFragSize() { | 317 | int Device::getDeviceFragSize() { |
310 | int frag_size; | 318 | int frag_size; |
311 | 319 | ||
312 | if (ioctl( sd, SNDCTL_DSP_GETBLKSIZE, &frag_size) == -1) { | 320 | if (ioctl( sd, SNDCTL_DSP_GETBLKSIZE, &frag_size) == -1) { |
313 | qDebug("no fragsize"); | 321 | qDebug("no fragsize"); |
314 | } else | 322 | } else { |
315 | qDebug("driver says frag size is %d", frag_size); | 323 | qDebug("driver says frag size is %d", frag_size); |
324 | } | ||
316 | return frag_size; | 325 | return frag_size; |
317 | } | 326 | } |
318 | 327 | ||
319 | bool Device::setFragSize(int frag) { | 328 | bool Device::setFragSize(int frag) { |
320 | if (ioctl(sd, SNDCTL_DSP_SETFRAGMENT, &frag)) { | 329 | if (ioctl(sd, SNDCTL_DSP_SETFRAGMENT, &frag)) { |
321 | perror("ioctl(\"SNDCTL_DSP_SETFRAGMENT\")"); | 330 | perror("ioctl(\"SNDCTL_DSP_SETFRAGMENT\")"); |
@@ -330,6 +339,20 @@ bool Device::reset() { | |||
330 | if (ioctl( sd, SNDCTL_DSP_RESET, 0) == -1) { | 339 | if (ioctl( sd, SNDCTL_DSP_RESET, 0) == -1) { |
331 | perror("ioctl(\"SNDCTL_DSP_RESET\")"); | 340 | perror("ioctl(\"SNDCTL_DSP_RESET\")"); |
332 | return false; | 341 | return false; |
333 | } | 342 | } |
334 | return true; | 343 | return true; |
335 | } | 344 | } |
345 | |||
346 | int Device::devRead(int soundDescriptor, short *buf, int size) { | ||
347 | int number = 0; | ||
348 | number = ::read( soundDescriptor, (char *)buf, size); | ||
349 | return number; | ||
350 | } | ||
351 | |||
352 | int Device::devWrite(int soundDescriptor, short * buf, int size) { | ||
353 | int bytesWritten = 0; | ||
354 | bytesWritten = ::write( soundDescriptor, buf, size); | ||
355 | return bytesWritten; | ||
356 | } | ||
357 | |||
358 | |||