summaryrefslogtreecommitdiff
Unidiff
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--core/applets/vmemo/vmemo.cpp182
1 files changed, 94 insertions, 88 deletions
diff --git a/core/applets/vmemo/vmemo.cpp b/core/applets/vmemo/vmemo.cpp
index 73bd996..83f19f5 100644
--- a/core/applets/vmemo/vmemo.cpp
+++ b/core/applets/vmemo/vmemo.cpp
@@ -30,10 +30,11 @@ typedef struct _waveheader {
30 u_long main_chunk; /* 'RIFF' */ 30 u_long main_chunk; /* 'RIFF' */
31 u_long length; /* filelen */ 31 u_long length; /* filelen */
32 u_long chunk_type; /* 'WAVE' */ 32 u_long chunk_type; /* 'WAVE' */
33
34 u_long sub_chunk; /* 'fmt ' */ 33 u_long sub_chunk; /* 'fmt ' */
35 u_long sc_len; /* length of sub_chunk, =16 (chunckSize) */ 34 u_long sc_len; /* length of sub_chunk, =16
35 (chunckSize) format len */
36 u_short format; /* should be 1 for PCM-code (formatTag) */ 36 u_short format; /* should be 1 for PCM-code (formatTag) */
37
37 u_short modus; /* 1 Mono, 2 Stereo (channels) */ 38 u_short modus; /* 1 Mono, 2 Stereo (channels) */
38 u_long sample_fq; /* samples per second (samplesPerSecond) */ 39 u_long sample_fq; /* samples per second (samplesPerSecond) */
39 u_long byte_p_sec; /* avg bytes per second (avgBytePerSecond) */ 40 u_long byte_p_sec; /* avg bytes per second (avgBytePerSecond) */
@@ -41,6 +42,7 @@ typedef struct _waveheader {
41 u_short bit_p_spl; /* 8, 12 or 16 bit (bitsPerSample) */ 42 u_short bit_p_spl; /* 8, 12 or 16 bit (bitsPerSample) */
42 43
43 u_long data_chunk; /* 'data' */ 44 u_long data_chunk; /* 'data' */
45
44 u_long data_length;/* samplecount */ 46 u_long data_length;/* samplecount */
45} WaveHeader; 47} WaveHeader;
46 48
@@ -140,17 +142,17 @@ VMemo::VMemo( QWidget *parent, const char *name )
140 recording = FALSE; 142 recording = FALSE;
141 143
142 struct utsname name; /* check for embedix kernel running on the zaurus, if 144 struct utsname name; /* check for embedix kernel running on the zaurus, if
143 lineo change string, this break 145 lineo change string, this break
144 */ 146 */
145 if (uname(&name) != -1) 147 if (uname(&name) != -1)
146 { 148 {
147 QString release=name.release; 149 QString release=name.release;
148 qWarning("System release: %s\n", name.release); 150 qWarning("System release: %s\n", name.release);
149 if(release.find("embedix",0,TRUE) !=-1) 151 if(release.find("embedix",0,TRUE) !=-1)
150 systemZaurus=TRUE; 152 systemZaurus=TRUE;
151 else 153 else
152 systemZaurus=FALSE; 154 systemZaurus=FALSE;
153 } 155 }
154 156
155} 157}
156 158
@@ -168,10 +170,10 @@ void VMemo::mousePressEvent( QMouseEvent * )
168{ 170{
169 // just to be safe 171 // just to be safe
170 if (recording) 172 if (recording)
171 { 173 {
172 recording = FALSE; 174 recording = FALSE;
173 return; 175 return;
174 } 176 }
175 177
176 qWarning("VMemo::mousePress()"); 178 qWarning("VMemo::mousePress()");
177 QSound::play(Resource::findSound("vmemob")); 179 QSound::play(Resource::findSound("vmemob"));
@@ -179,12 +181,12 @@ void VMemo::mousePressEvent( QMouseEvent * )
179 recording = TRUE; 181 recording = TRUE;
180 qWarning("VMemo::mousePress() -> Starting to record"); 182 qWarning("VMemo::mousePress() -> Starting to record");
181 if (openDSP() == -1) 183 if (openDSP() == -1)
182 { 184 {
183 // ### Display an error box 185 // ### Display an error box
184 QMessageBox::critical(0, "VMemo", "Could not open dsp device.", "Abort"); 186 QMessageBox::critical(0, "VMemo", "Could not open dsp device.", "Abort");
185 recording = FALSE; 187 recording = FALSE;
186 return; 188 return;
187 } 189 }
188 190
189 Config vmCfg("VMemo"); 191 Config vmCfg("VMemo");
190 vmCfg.setGroup("Defaults"); 192 vmCfg.setGroup("Defaults");
@@ -192,9 +194,9 @@ void VMemo::mousePressEvent( QMouseEvent * )
192 QDateTime dt = QDateTime::currentDateTime(); 194 QDateTime dt = QDateTime::currentDateTime();
193 QString fileName; 195 QString fileName;
194 if(systemZaurus) 196 if(systemZaurus)
195 fileName=vmCfg.readEntry("Dir", "/mnt/cf/"); // zaurus does not have /mnt/ramfs 197 fileName=vmCfg.readEntry("Dir", "/mnt/cf/"); // zaurus does not have /mnt/ramfs
196 else 198 else
197 fileName=vmCfg.readEntry("Dir", "/mnt/ramfs/"); 199 fileName=vmCfg.readEntry("Dir", "/mnt/ramfs/");
198 200
199 fileName += "vm_"; 201 fileName += "vm_";
200 fileName += dt.toString(); 202 fileName += dt.toString();
@@ -207,12 +209,12 @@ void VMemo::mousePressEvent( QMouseEvent * )
207 fileName.replace(QRegExp(","),""); 209 fileName.replace(QRegExp(","),"");
208 210
209 if(openWAV(fileName.latin1()) == -1) 211 if(openWAV(fileName.latin1()) == -1)
210 { 212 {
211 // ### Display an error box 213 // ### Display an error box
212 qWarning("VMemo::mousePress() -> WAV error"); 214 qWarning("VMemo::mousePress() -> WAV error");
213 close(dsp); 215 close(dsp);
214 return; 216 return;
215 } 217 }
216 218
217 QArray<int> cats(1); 219 QArray<int> cats(1);
218 cats[0] = vmCfg.readNumEntry("Category", 0); 220 cats[0] = vmCfg.readNumEntry("Category", 0);
@@ -242,48 +244,51 @@ int VMemo::openDSP()
242 244
243 speed = cfg.readNumEntry("SampleRate", 11025); 245 speed = cfg.readNumEntry("SampleRate", 11025);
244 channels = cfg.readNumEntry("Stereo", 1) ? 2 : 1; // 1 = stereo(2), 0 = mono(1) 246 channels = cfg.readNumEntry("Stereo", 1) ? 2 : 1; // 1 = stereo(2), 0 = mono(1)
245 if (cfg.readNumEntry("SixteenBit", 1)) 247 if (cfg.readNumEntry("SixteenBit", 1)==1)
246 { 248 {
247 format = AFMT_S16_LE; 249 format = AFMT_S16_LE;
248 resolution = 16; 250 resolution = 16;
249 } 251 }
250 else 252 else
251 { 253 {
252 format = AFMT_U8; 254 format = AFMT_U8;
253 resolution = 8; 255 resolution = 8;
254 } 256 }
255 257
256 if(systemZaurus) 258 if(systemZaurus)
257 dsp = open("/dev/dsp1", O_RDWR); //Zaurus needs /dev/dsp1 259 {
260 dsp = open("/dev/dsp1", O_RDWR); //Zaurus needs /dev/dsp1
261 channels=1; //zaurus has one input channel
262 }
258 else 263 else
259 dsp = open("/dev/dsp", O_RDWR); 264 dsp = open("/dev/dsp", O_RDWR);
260 265
261 if(dsp == -1) 266 if(dsp == -1)
262 { 267 {
263 perror("open(\"/dev/dsp\")"); 268 perror("open(\"/dev/dsp\")");
264 return -1; 269 return -1;
265 } 270 }
266 271
267 if(ioctl(dsp, SNDCTL_DSP_SETFMT , &format)==-1) 272 if(ioctl(dsp, SNDCTL_DSP_SETFMT , &format)==-1)
268 { 273 {
269 perror("ioctl(\"SNDCTL_DSP_SETFMT\")"); 274 perror("ioctl(\"SNDCTL_DSP_SETFMT\")");
270 return -1; 275 return -1;
271 } 276 }
272 if(ioctl(dsp, SNDCTL_DSP_CHANNELS , &channels)==-1) 277 if(ioctl(dsp, SNDCTL_DSP_CHANNELS , &channels)==-1)
273 { 278 {
274 perror("ioctl(\"SNDCTL_DSP_CHANNELS\")"); 279 perror("ioctl(\"SNDCTL_DSP_CHANNELS\")");
275 return -1; 280 return -1;
276 } 281 }
277 if(ioctl(dsp, SNDCTL_DSP_SPEED , &speed)==-1) 282 if(ioctl(dsp, SNDCTL_DSP_SPEED , &speed)==-1)
278 { 283 {
279 perror("ioctl(\"SNDCTL_DSP_SPEED\")"); 284 perror("ioctl(\"SNDCTL_DSP_SPEED\")");
280 return -1; 285 return -1;
281 } 286 }
282 if(ioctl(dsp, SOUND_PCM_READ_RATE , &rate)==-1) 287 if(ioctl(dsp, SOUND_PCM_READ_RATE , &rate)==-1)
283 { 288 {
284 perror("ioctl(\"SOUND_PCM_READ_RATE\")"); 289 perror("ioctl(\"SOUND_PCM_READ_RATE\")");
285 return -1; 290 return -1;
286 } 291 }
287 292
288 return 1; 293 return 1;
289} 294}
@@ -293,30 +298,28 @@ int VMemo::openWAV(const char *filename)
293 qDebug("Creating %s ",filename); 298 qDebug("Creating %s ",filename);
294 track.setName(filename); 299 track.setName(filename);
295 if(!track.open(IO_WriteOnly|IO_Truncate|IO_Raw)) 300 if(!track.open(IO_WriteOnly|IO_Truncate|IO_Raw))
296 { 301 {
297 qDebug("Could not open file"); 302 qDebug("Could not open file");
298 return -1; 303 return -1;
299 } 304 }
300 wav=track.handle(); 305 wav=track.handle();
301 306
302 WaveHeader wh; 307 WaveHeader wh;
303 308
304 wh.main_chunk = RIFF; 309 wh.main_chunk = RIFF;// RIFF
305 wh.length = 0; 310 wh.chunk_type = WAVE;//WAVE
306 wh.chunk_type = WAVE; 311 wh.sub_chunk = FMT;// fmt
307 312 wh.sc_len = 16;// format length = 16
308 wh.sub_chunk = FMT; 313 wh.format = PCM_CODE;// PCM
309 wh.sc_len = 16; 314 wh.modus = channels;// channels
310 wh.format = PCM_CODE; 315 wh.sample_fq = speed;//samplerate
311 wh.modus = channels; 316 wh.byte_p_sec = speed * channels * resolution/8;// av bytes per second
312 wh.sample_fq = speed; 317 wh.byte_p_spl = channels * (resolution / 8); //block align
313 wh.bit_p_spl = resolution; 318 wh.bit_p_spl = resolution;//bits per sample 8, or 16
314 wh.byte_p_sec = wh.sample_fq * wh.bit_p_spl;
315 wh.byte_p_spl = channels * (wh.bit_p_spl % 8);
316
317 wh.data_chunk = DATA; 319 wh.data_chunk = DATA;
318 wh.data_length= 0; 320 wh.data_length= 0; // <---
319 321// qDebug("Write header channels %d, speed %d, b/s %d, blockalign %d, bitrate %d"
322// , wh.modus, wh.sample_fq, wh.byte_p_sec, wh.byte_p_spl, wh.bit_p_spl );
320 write (wav, &wh, sizeof(WaveHeader)); 323 write (wav, &wh, sizeof(WaveHeader));
321 324
322 return 1; 325 return 1;
@@ -330,14 +333,16 @@ void VMemo::record(void)
330 qWarning("VMemo::record()"); 333 qWarning("VMemo::record()");
331 334
332 while(recording) 335 while(recording)
333 { 336 {
334 result = read(dsp, sound, 512); // 8192 337 result = read(dsp, sound, 512); // 8192
335 qApp->processEvents(); 338 qApp->processEvents();
336 write(wav, sound, result); 339 write(wav, sound, result);
337 qApp->processEvents(); 340 qApp->processEvents();
338 length += result; 341 length += result;
339 qApp->processEvents(); 342 qApp->processEvents();
340 } 343// printf("%d\r",length);
344// fflush(stdout);
345 }
341 346
342 qWarning("VMemo::record() -> Done recording"); 347 qWarning("VMemo::record() -> Done recording");
343 qWarning("VMemo::record() -> Closing dsp"); 348 qWarning("VMemo::record() -> Closing dsp");
@@ -347,10 +352,11 @@ void VMemo::record(void)
347 write(wav, &value, 4); 352 write(wav, &value, 4);
348 lseek(wav, 40, SEEK_SET); 353 lseek(wav, 40, SEEK_SET);
349 write(wav, &length, 4); 354 write(wav, &length, 4);
355// qDebug("File length %d, samplecount %d", value, length);
350 track.close(); 356 track.close();
351 357
352 if( ioctl( dsp, SNDCTL_DSP_RESET,0) == -1)// ); //tell driver to stop for a while 358 if( ioctl( dsp, SNDCTL_DSP_RESET,0) == -1)// ); //tell driver to stop for a while
353 perror("ioctl(\"SNDCTL_DSP_RESET\")"); 359 perror("ioctl(\"SNDCTL_DSP_RESET\")");
354 ::close(dsp); 360 ::close(dsp);
355 361
356 qWarning("VMemo::record() -> playing done recording sound"); 362 qWarning("VMemo::record() -> playing done recording sound");