summaryrefslogtreecommitdiff
path: root/core/applets/vmemo/vmemo.cpp
Unidiff
Diffstat (limited to 'core/applets/vmemo/vmemo.cpp') (more/less context) (ignore whitespace changes)
-rw-r--r--core/applets/vmemo/vmemo.cpp150
1 files changed, 58 insertions, 92 deletions
diff --git a/core/applets/vmemo/vmemo.cpp b/core/applets/vmemo/vmemo.cpp
index b77e3b8..b5239eb 100644
--- a/core/applets/vmemo/vmemo.cpp
+++ b/core/applets/vmemo/vmemo.cpp
@@ -1,83 +1,94 @@
1/************************************************************************************ 1/************************************************************************************
2 ** 2 **
3 ** This file may be distributed and/or modified under the terms of the 3 ** This file may be distributed and/or modified under the terms of the
4 ** GNU General Public License version 2 as published by the Free Software 4 ** GNU General Public License version 2 as published by the Free Software
5 ** Foundation and appearing in the file LICENSE.GPL included in the 5 ** Foundation and appearing in the file LICENSE.GPL included in the
6 ** packaging of this file. 6 ** packaging of this file.
7 ** 7 **
8 ** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE 8 ** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
9 ** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. 9 ** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
10 ** 10 **
11 ************************************************************************************/ 11 ************************************************************************************/
12// copyright 2002 Jeremy Cowgar <jc@cowgar.com> 12// copyright 2002 Jeremy Cowgar <jc@cowgar.com>
13/* 13/*
14 * $Id$ 14 * $Id$
15 */ 15 */
16// Sun 03-17-2002 L.J.Potter <ljp@llornkcor.com> 16// Sun 03-17-2002 L.J.Potter <ljp@llornkcor.com>
17extern "C" {
18#include "adpcm.h"
19}
20
17#include <sys/utsname.h> 21#include <sys/utsname.h>
18#include <sys/time.h> 22#include <sys/time.h>
19#include <sys/types.h> 23#include <sys/types.h>
20#include <unistd.h> 24#include <unistd.h>
21#include <stdio.h> 25#include <stdio.h>
22#include <sys/stat.h> 26#include <sys/stat.h>
23#include <fcntl.h> 27#include <fcntl.h>
24#include <sys/ioctl.h> 28#include <sys/ioctl.h>
25#include <linux/soundcard.h> 29#include <linux/soundcard.h>
26 30
27#include <string.h> 31#include <string.h>
28#include <stdlib.h> 32#include <stdlib.h>
29#include <errno.h> 33#include <errno.h>
30#include <qtimer.h> 34#include <qtimer.h>
31 35
32typedef struct _waveheader { 36typedef struct _waveheader {
33 u_long main_chunk; /* 'RIFF' */ 37 u_long main_chunk; /* 'RIFF' */
34 u_long length; /* filelen */ 38 u_long length; /* filelen */
35 u_long chunk_type; /* 'WAVE' */ 39 u_long chunk_type; /* 'WAVE' */
36 u_long sub_chunk; /* 'fmt ' */ 40 u_long sub_chunk; /* 'fmt ' */
37 u_long sc_len; /* length of sub_chunk, =16 41 u_long sc_len; /* length of sub_chunk, =16
38 (chunckSize) format len */ 42 (chunckSize) format len */
39 u_short format; /* should be 1 for PCM-code (formatTag) */ 43 u_short format; /* should be 1 for PCM-code (formatTag) */
40 44
41 u_short modus; /* 1 Mono, 2 Stereo (channels) */ 45 u_short modus; /* 1 Mono, 2 Stereo (channels) */
42 u_long sample_fq; /* samples per second (samplesPerSecond) */ 46 u_long sample_fq; /* samples per second (samplesPerSecond) */
43 u_long byte_p_sec; /* avg bytes per second (avgBytePerSecond) */ 47 u_long byte_p_sec; /* avg bytes per second (avgBytePerSecond) */
44 u_short byte_p_spl; /* samplesize; 1 or 2 bytes (blockAlign) */ 48 u_short byte_p_spl; /* samplesize; 1 or 2 bytes (blockAlign) */
45 u_short bit_p_spl; /* 8, 12 or 16 bit (bitsPerSample) */ 49 u_short bit_p_spl; /* 8, 12 or 16 bit (bitsPerSample) */
46 50
47 u_long data_chunk; /* 'data' */ 51 u_long data_chunk; /* 'data' */
48 52
49 u_long data_length;/* samplecount */ 53 u_long data_length;/* samplecount */
50} WaveHeader; 54} WaveHeader;
51 55
52#define RIFF 0x46464952 56#define RIFF 0x46464952
53#define WAVE 0x45564157 57#define WAVE 0x45564157
54#define FMT 0x20746D66 58#define FMT 0x20746D66
55#define DATA 0x61746164 59#define DATA 0x61746164
56#define PCM_CODE 1 60#define PCM_CODE 1
57#define WAVE_MONO 1 61#define WAVE_MONO 1
58#define WAVE_STEREO 2 62#define WAVE_STEREO 2
59 63
64struct adpcm_state encoder_state;
65//struct adpcm_state decoder_state;
66
67#define WAVE_FORMAT_DVI_ADPCM (0x0011)
68#define WAVE_FORMAT_PCM (0x0001)
69
70
60#include "vmemo.h" 71#include "vmemo.h"
61 72
62#include <qpe/qpeapplication.h> 73#include <qpe/qpeapplication.h>
63#include <qpe/resource.h> 74#include <qpe/resource.h>
64#include <qpe/config.h> 75#include <qpe/config.h>
65 76
66#include <qpainter.h> 77#include <qpainter.h>
67#include <qdatetime.h> 78#include <qdatetime.h>
68#include <qregexp.h> 79#include <qregexp.h>
69#include <qsound.h> 80#include <qsound.h>
70#include <qfile.h> 81#include <qfile.h>
71#include <qmessagebox.h> 82#include <qmessagebox.h>
72 83
73int seq = 0; 84int seq = 0;
74 85
75/* XPM */ 86/* XPM */
76static char * vmemo_xpm[] = { 87static char * vmemo_xpm[] = {
77 "16 16 102 2", 88 "16 16 102 2",
78 " c None", 89 " c None",
79 ". c #60636A", 90 ". c #60636A",
80 "+ c #6E6E72", 91 "+ c #6E6E72",
81 "@ c #68696E", 92 "@ c #68696E",
82 "# c #4D525C", 93 "# c #4D525C",
83 "$ c #6B6C70", 94 "$ c #6B6C70",
@@ -175,144 +186,138 @@ static char * vmemo_xpm[] = {
175 "$. c #B5B5BE", 186 "$. c #B5B5BE",
176 "%. c #616167", 187 "%. c #616167",
177 "&. c #1A1D22", 188 "&. c #1A1D22",
178 "*. c #000713", 189 "*. c #000713",
179 "=. c #1F1F21", 190 "=. c #1F1F21",
180 " ", 191 " ",
181 " . + @ # ", 192 " . + @ # ",
182 " $ % & * = - ", 193 " $ % & * = - ",
183 " ; > , ' ) ! ~ ", 194 " ; > , ' ) ! ~ ",
184 " { ] ^ / ( _ : ", 195 " { ] ^ / ( _ : ",
185 " < [ } | 1 2 3 ", 196 " < [ } | 1 2 3 ",
186 " 4 5 6 7 8 9 0 a b c ", 197 " 4 5 6 7 8 9 0 a b c ",
187 " d e f g h i j 3 k l m n ", 198 " d e f g h i j 3 k l m n ",
188 " o p q r s t u v w n ", 199 " o p q r s t u v w n ",
189 " o x y z A B C D E n ", 200 " o x y z A B C D E n ",
190 " F G H I J K L M N O ", 201 " F G H I J K L M N O ",
191 " P Q R S T U V W X ", 202 " P Q R S T U V W X ",
192 " Y Z ` b ...+. ", 203 " Y Z ` b ...+. ",
193 " @.#.$.%.&. ", 204 " @.#.$.%.&. ",
194 " *.B =. ", 205 " *.B =. ",
195 " n n n n n n n n n "}; 206 " n n n n n n n n n "};
196 207
197 208
198VMemo::VMemo( QWidget *parent, const char *_name ) 209VMemo::VMemo( QWidget *parent, const char *_name )
199 : QWidget( parent, _name ) 210 : QWidget( parent, _name ) {
200{
201 setFixedHeight( 18 ); 211 setFixedHeight( 18 );
202 setFixedWidth( 14 ); 212 setFixedWidth( 14 );
203 213
204 recording = FALSE; 214 recording = FALSE;
205 215
206 t_timer = new QTimer( this ); 216 t_timer = new QTimer( this );
207 connect( t_timer, SIGNAL( timeout() ), SLOT( timerBreak() ) ); 217 connect( t_timer, SIGNAL( timeout() ), SLOT( timerBreak() ) );
208 218
209 struct utsname name; /* check for embedix kernel running on the zaurus*/ 219 struct utsname name; /* check for embedix kernel running on the zaurus*/
210 if (uname(&name) != -1) { 220 if (uname(&name) != -1) {
211 QString release=name.release; 221 QString release=name.release;
212 222
213 Config vmCfg("Vmemo"); 223 Config vmCfg("Vmemo");
214 vmCfg.setGroup("Defaults"); 224 vmCfg.setGroup("Defaults");
215 int toggleKey = setToggleButton(vmCfg.readNumEntry("toggleKey", -1)); 225 int toggleKey = setToggleButton(vmCfg.readNumEntry("toggleKey", -1));
226 useADPCM = vmCfg.readBoolEntry("use_ADPCM", 0);
216 227
217 qDebug("toggleKey %d", toggleKey); 228 qDebug("toggleKey %d", toggleKey);
218 229
219 if(release.find("embedix",0,TRUE) !=-1) 230 if(release.find("embedix",0,TRUE) !=-1)
220 systemZaurus=TRUE; 231 systemZaurus=TRUE;
221 else 232 else
222 systemZaurus=FALSE; 233 systemZaurus=FALSE;
223 234
224 myChannel = new QCopChannel( "QPE/VMemo", this ); 235 myChannel = new QCopChannel( "QPE/VMemo", this );
225 connect( myChannel, SIGNAL(received(const QCString&, const QByteArray&)), 236 connect( myChannel, SIGNAL(received(const QCString&, const QByteArray&)),
226 this, SLOT(receive(const QCString&, const QByteArray&)) ); 237 this, SLOT(receive(const QCString&, const QByteArray&)) );
227 238
228 if( toggleKey != -1 ) { 239 if( toggleKey != -1 ) {
229 // QPEApplication::grabKeyboard(); 240 // QPEApplication::grabKeyboard();
230 QCopEnvelope e("QPE/Desktop", "keyRegister(int key, QString channel, QString message)"); 241 QCopEnvelope e("QPE/Desktop", "keyRegister(int key, QString channel, QString message)");
231 // e << 4096; // Key_Escape 242 // e << 4096; // Key_Escape
232 // e << Key_F5; //4148 243 // e << Key_F5; //4148
233 e << toggleKey; 244 e << toggleKey;
234 e << QString("QPE/VMemo"); 245 e << QString("QPE/VMemo");
235 e << QString("toggleRecord()"); 246 e << QString("toggleRecord()");
236 } 247 }
237 if(toggleKey == 1) 248 if(toggleKey == 1)
238 usingIcon=TRUE; 249 usingIcon=TRUE;
239 else 250 else
240 usingIcon=FALSE; 251 usingIcon=FALSE;
241 if( vmCfg.readNumEntry("hideIcon",0) == 1) 252 if( vmCfg.readNumEntry("hideIcon",0) == 1)
242 hide(); 253 hide();
243 } 254 }
244} 255}
245 256
246VMemo::~VMemo() 257VMemo::~VMemo() {
247{
248} 258}
249 259
250void VMemo::receive( const QCString &msg, const QByteArray &data ) 260void VMemo::receive( const QCString &msg, const QByteArray &data ) {
251{
252 qDebug("receive"); 261 qDebug("receive");
253 QDataStream stream( data, IO_ReadOnly ); 262 QDataStream stream( data, IO_ReadOnly );
254 if (msg == "toggleRecord()") { 263 if (msg == "toggleRecord()") {
255 if (recording) { 264 if (recording) {
256 fromToggle = TRUE; 265 fromToggle = TRUE;
257 mouseReleaseEvent(NULL); 266 mouseReleaseEvent(NULL);
258// stopRecording(); 267// stopRecording();
259 } else { 268 } else {
260 fromToggle = TRUE; 269 fromToggle = TRUE;
261 // mousePressEvent(NULL); 270 // mousePressEvent(NULL);
262 startRecording(); 271 startRecording();
263 } 272 }
264 } 273 }
265} 274}
266 275
267void VMemo::paintEvent( QPaintEvent* ) 276void VMemo::paintEvent( QPaintEvent* ) {
268{
269 QPainter p(this); 277 QPainter p(this);
270 p.drawPixmap( 0, 1,( const char** ) vmemo_xpm ); 278 p.drawPixmap( 0, 1,( const char** ) vmemo_xpm );
271} 279}
272 280
273void VMemo::mousePressEvent( QMouseEvent * me) 281void VMemo::mousePressEvent( QMouseEvent * me) {
274{
275 // just to be safe 282 // just to be safe
276 if (recording) { 283 if (recording) {
277 recording = FALSE; 284 recording = FALSE;
278 return; 285 return;
279 } 286 }
280 /* No mousePress/mouseRelease recording on the iPAQ. The REC button on the iPAQ calls these functions 287 /* No mousePress/mouseRelease recording on the iPAQ. The REC button on the iPAQ calls these functions
281 mousePressEvent and mouseReleaseEvent with a NULL parameter. */ 288 mousePressEvent and mouseReleaseEvent with a NULL parameter. */
282 if ( me->button() != LeftButton) 289 if ( me->button() != LeftButton || me != NULL)
283
284 // if (!systemZaurus && me != NULL) 290 // if (!systemZaurus && me != NULL)
285 return; 291 return;
286 292
287 if(!recording) 293 if(!recording)
288 startRecording(); 294 startRecording();
289 else 295 else
290 stopRecording(); 296 stopRecording();
291} 297}
292 298
293void VMemo::mouseReleaseEvent( QMouseEvent * ) 299void VMemo::mouseReleaseEvent( QMouseEvent * ) {
294{
295// if(usingIcon && !recording) 300// if(usingIcon && !recording)
296// stopRecording(); 301// stopRecording();
297} 302}
298 303
299bool VMemo::startRecording() { 304bool VMemo::startRecording() {
300 305
301 if ( recording) 306 if ( recording)
302 return FALSE; 307 return FALSE;
303 308
304 Config config( "Vmemo" ); 309 Config config( "Vmemo" );
305 config.setGroup( "System" ); 310 config.setGroup( "System" );
306 311
307 useAlerts = config.readBoolEntry("Alert",1); 312 useAlerts = config.readBoolEntry("Alert",1);
308 if(useAlerts) { 313 if(useAlerts) {
309 314
310 msgLabel = new QLabel( 0, "alertLabel" ); 315 msgLabel = new QLabel( 0, "alertLabel" );
311 msgLabel->setText("<B><P><font size=+2>VMemo-Recording</font></B>"); 316 msgLabel->setText("<B><P><font size=+2>VMemo-Recording</font></B>");
312 msgLabel->show(); 317 msgLabel->show();
313 } 318 }
314 319
315 // if(useAlerts) 320 // if(useAlerts)
316 // QMessageBox::message("VMemo","Really Record?");//) ==1) 321 // QMessageBox::message("VMemo","Really Record?");//) ==1)
317 // return; 322 // return;
318 // } else { 323 // } else {
@@ -354,89 +359,87 @@ bool VMemo::startRecording() {
354 fName = "vm_"+ dt.toString()+ ".wav"; 359 fName = "vm_"+ dt.toString()+ ".wav";
355 360
356 fileName+=fName; 361 fileName+=fName;
357 qDebug("filename is "+fileName); 362 qDebug("filename is "+fileName);
358 // No spaces in the filename 363 // No spaces in the filename
359 fileName.replace(QRegExp("'"),""); 364 fileName.replace(QRegExp("'"),"");
360 fileName.replace(QRegExp(" "),"_"); 365 fileName.replace(QRegExp(" "),"_");
361 fileName.replace(QRegExp(":"),"."); 366 fileName.replace(QRegExp(":"),".");
362 fileName.replace(QRegExp(","),""); 367 fileName.replace(QRegExp(","),"");
363 368
364// open tmp file here 369// open tmp file here
365 char *pointer; 370 char *pointer;
366 pointer=tmpnam(NULL); 371 pointer=tmpnam(NULL);
367 qDebug("Opening tmp file %s",pointer); 372 qDebug("Opening tmp file %s",pointer);
368 373
369 if(openWAV(pointer ) == -1) { 374 if(openWAV(pointer ) == -1) {
370 375
371// if(openWAV(fileName.latin1()) == -1) { 376// if(openWAV(fileName.latin1()) == -1) {
372 QString err("Could not open the temp file\n"); 377 QString err("Could not open the temp file\n");
373 err += fileName; 378 err += fileName;
374 QMessageBox::critical(0, "vmemo", err, "Abort"); 379 QMessageBox::critical(0, "vmemo", err, "Abort");
375 ::close(dsp); 380 ::close(dsp);
376 return FALSE; 381 return FALSE;
377 } 382 }
378 QString cmd; 383 record();
379 cmd.sprintf("mv %s "+fileName,pointer);
380 384
385 QString cmd;
386 cmd.sprintf("mv %s "+fileName, pointer);
381// move tmp file to regular file here 387// move tmp file to regular file here
382 system(cmd.latin1()); 388 system(cmd.latin1());
383 389
384 QArray<int> cats(1); 390 QArray<int> cats(1);
385 cats[0] = config.readNumEntry("Category", 0); 391 cats[0] = config.readNumEntry("Category", 0);
386 392
387 QString dlName("vm_"); 393 QString dlName("vm_");
388 dlName += dt.toString(); 394 dlName += dt.toString();
389 DocLnk l; 395 DocLnk l;
390 l.setFile(fileName); 396 l.setFile(fileName);
391 l.setName(dlName); 397 l.setName(dlName);
392 l.setType("audio/x-wav"); 398 l.setType("audio/x-wav");
393 l.setCategories(cats); 399 l.setCategories(cats);
394 l.writeLink(); 400 l.writeLink();
395
396 record();
397 401
398 return TRUE; 402 return TRUE;
399} 403}
400 404
401void VMemo::stopRecording() { 405void VMemo::stopRecording() {
402 show(); 406 show();
403 qDebug("Stopped recording"); 407 qDebug("Stopped recording");
404 recording = FALSE; 408 recording = FALSE;
405 if(useAlerts) { 409 if(useAlerts) {
406 msgLabel->close(); 410 msgLabel->close();
407 msgLabel=0; 411 msgLabel=0;
408 delete msgLabel; 412 delete msgLabel;
409 } 413 }
410 t_timer->stop(); 414 t_timer->stop();
411 Config cfg("Vmemo"); 415 Config cfg("Vmemo");
412 cfg.setGroup("Defaults"); 416 cfg.setGroup("Defaults");
413 if( cfg.readNumEntry("hideIcon",0) == 1 ) 417 if( cfg.readNumEntry("hideIcon",0) == 1 )
414 hide(); 418 hide();
415} 419}
416 420
417int VMemo::openDSP() 421int VMemo::openDSP() {
418{
419 Config cfg("Vmemo"); 422 Config cfg("Vmemo");
420 cfg.setGroup("Record"); 423 cfg.setGroup("Record");
421 424
422 speed = cfg.readNumEntry("SampleRate", 22050); 425 speed = cfg.readNumEntry("SampleRate", 22050);
423 channels = cfg.readNumEntry("Stereo", 1) ? 2 : 1; // 1 = stereo(2), 0 = mono(1) 426 channels = cfg.readNumEntry("Stereo", 1) ? 2 : 1; // 1 = stereo(2), 0 = mono(1)
424 if (cfg.readNumEntry("SixteenBit", 1)==1) { 427 if (cfg.readNumEntry("SixteenBit", 1)==1) {
425 format = AFMT_S16_LE; 428 format = AFMT_S16_LE;
426 resolution = 16; 429 resolution = 16;
427 } else { 430 } else {
428 format = AFMT_U8; 431 format = AFMT_U8;
429 resolution = 8; 432 resolution = 8;
430 } 433 }
431 434
432 qDebug("samplerate: %d, channels %d, resolution %d", speed, channels, resolution); 435 qDebug("samplerate: %d, channels %d, resolution %d", speed, channels, resolution);
433 436
434 if(systemZaurus) { 437 if(systemZaurus) {
435 dsp = open("/dev/dsp1", O_RDONLY); //Zaurus needs /dev/dsp1 438 dsp = open("/dev/dsp1", O_RDONLY); //Zaurus needs /dev/dsp1
436 channels=1; //zaurus has one input channel 439 channels=1; //zaurus has one input channel
437 } else { 440 } else {
438 dsp = open("/dev/dsp", O_RDONLY); 441 dsp = open("/dev/dsp", O_RDONLY);
439 } 442 }
440 443
441 if(dsp == -1) { 444 if(dsp == -1) {
442 perror("open(\"/dev/dsp\")"); 445 perror("open(\"/dev/dsp\")");
@@ -446,182 +449,145 @@ int VMemo::openDSP()
446 } 449 }
447 450
448 if(ioctl(dsp, SNDCTL_DSP_SETFMT , &format)==-1) { 451 if(ioctl(dsp, SNDCTL_DSP_SETFMT , &format)==-1) {
449 perror("ioctl(\"SNDCTL_DSP_SETFMT\")"); 452 perror("ioctl(\"SNDCTL_DSP_SETFMT\")");
450 return -1; 453 return -1;
451 } 454 }
452 if(ioctl(dsp, SNDCTL_DSP_CHANNELS , &channels)==-1) { 455 if(ioctl(dsp, SNDCTL_DSP_CHANNELS , &channels)==-1) {
453 perror("ioctl(\"SNDCTL_DSP_CHANNELS\")"); 456 perror("ioctl(\"SNDCTL_DSP_CHANNELS\")");
454 return -1; 457 return -1;
455 } 458 }
456 if(ioctl(dsp, SNDCTL_DSP_SPEED , &speed)==-1) { 459 if(ioctl(dsp, SNDCTL_DSP_SPEED , &speed)==-1) {
457 perror("ioctl(\"SNDCTL_DSP_SPEED\")"); 460 perror("ioctl(\"SNDCTL_DSP_SPEED\")");
458 return -1; 461 return -1;
459 } 462 }
460 if(ioctl(dsp, SOUND_PCM_READ_RATE , &rate)==-1) { 463 if(ioctl(dsp, SOUND_PCM_READ_RATE , &rate)==-1) {
461 perror("ioctl(\"SOUND_PCM_READ_RATE\")"); 464 perror("ioctl(\"SOUND_PCM_READ_RATE\")");
462 return -1; 465 return -1;
463 } 466 }
464 467
465 QCopEnvelope( "QPE/System", "volumeChange(bool)" ) << FALSE; //mute 468 QCopEnvelope( "QPE/System", "volumeChange(bool)" ) << FALSE; //mute
466 469
467 return 1; 470 return 1;
468} 471}
469 472
470int VMemo::openWAV(const char *filename) 473int VMemo::openWAV(const char *filename) {
471{
472 track.setName(filename); 474 track.setName(filename);
473 if(!track.open(IO_WriteOnly|IO_Truncate|IO_Raw)) { 475 if(!track.open(IO_WriteOnly|IO_Truncate|IO_Raw)) {
474 errorMsg=filename; 476 errorMsg=filename;
475 return -1; 477 return -1;
476 } 478 }
477 479
478 wav=track.handle(); 480 wav=track.handle();
479 481
480 WaveHeader wh; 482 WaveHeader wh;
481 483
482 wh.main_chunk = RIFF; 484 wh.main_chunk = RIFF;
483 wh.length=0; 485 wh.length=0;
484 wh.chunk_type = WAVE; 486 wh.chunk_type = WAVE;
485 wh.sub_chunk = FMT; 487 wh.sub_chunk = FMT;
486 wh.sc_len = 16; 488 wh.sc_len = 16;
487 wh.format = PCM_CODE; 489 if(useADPCM)
490 wh.format = WAVE_FORMAT_DVI_ADPCM;//PCM_CODE;
491 else
492 wh.format = PCM_CODE;
488 wh.modus = channels; 493 wh.modus = channels;
489 wh.sample_fq = speed; 494 wh.sample_fq = speed;
490 wh.byte_p_sec = speed * channels * resolution/8; 495 wh.byte_p_sec = speed * channels * resolution/8;
491 wh.byte_p_spl = channels * (resolution / 8); 496 wh.byte_p_spl = channels * (resolution / 8);
492 wh.bit_p_spl = resolution; 497 wh.bit_p_spl = resolution;
493 wh.data_chunk = DATA; 498 wh.data_chunk = DATA;
494 wh.data_length= 0; 499 wh.data_length= 0;
495 // qDebug("Write header channels %d, speed %d, b/s %d, blockalign %d, bitrate %d" 500 // qDebug("Write header channels %d, speed %d, b/s %d, blockalign %d, bitrate %d"
496 // , wh.modus, wh.sample_fq, wh.byte_p_sec, wh.byte_p_spl, wh.bit_p_spl ); 501 // , wh.modus, wh.sample_fq, wh.byte_p_sec, wh.byte_p_spl, wh.bit_p_spl );
497 write (wav, &wh, sizeof(WaveHeader)); 502 write (wav, &wh, sizeof(WaveHeader));
498 503
499 return 1; 504 return 1;
500} 505}
501 506
502void VMemo::record(void) 507void VMemo::record(void) {
503{
504 int length=0, result, value; 508 int length=0, result, value;
505 QString msg; 509 QString msg;
506 msg.sprintf("Recording format %d", format); 510 msg.sprintf("Recording format %d", format);
507 qDebug(msg); 511 qDebug(msg);
508 Config config("Vmemo"); 512 Config config("Vmemo");
509 config.setGroup("Record"); 513 config.setGroup("Record");
510 int sRate=config.readNumEntry("SizeLimit", 30); 514 int sRate=config.readNumEntry("SizeLimit", 30);
511 515
512 t_timer->start( sRate * 1000+1000, TRUE); 516 t_timer->start( sRate * 1000+1000, TRUE);
513 517
514 if(systemZaurus) { 518// if(systemZaurus) {
519// } else { // 16 bit only capabilities
515 520
516 msg.sprintf("Recording format zaurus"); 521 msg.sprintf("Recording format other");
517 qDebug(msg); 522 qDebug(msg);
518 signed short sound[1024], monoBuffer[1024];
519
520 if(format==AFMT_S16_LE) {
521 523
524 int bufsize=1024;
525 int bytesWritten=0;
526 signed short sound[1024], monoBuffer[1024];
527 char abuf[bufsize/2];
528 short sbuf[bufsize];
522 529
530 while(recording) {
523 531
524 while(recording) { 532 if(useADPCM)
525 533 result = read( dsp, sbuf, bufsize); // 8192
526 result = read(dsp, sound, 1024); // 8192 534 else
527 // int j=0; 535 result = read(dsp, sound, 1024); // 8192
528 536 if( result <= 0) {
529 for (int i = 0; i < result; i++) { //since Z is mono do normally 537 perror("recording error ");
530 monoBuffer[i] = sound[i]; 538// qDebug(currentFileName);
539 QMessageBox::message(tr("Note"),tr("error recording"));
540 recording=FALSE;;
541 break;
531 } 542 }
532 543
533 length+=write(wav, monoBuffer, result); 544 if(useADPCM) {
534 if(length<0) 545 adpcm_coder( sbuf, abuf, result/2, &encoder_state);
535 recording=false; 546 bytesWritten = ::write(wav, abuf, result/4);
536 // for (int i = 0; i < result; i+=2) {
537 // monoBuffer[j] = sound[i];
538 // // monoBuffer[j] = (sound[i]+sound[i+1])/2;
539
540 // j++;
541 // }
542 qApp->processEvents();
543 // printf("%d\r",length);
544 // fflush(stdout);
545 }
546
547 } else { //AFMT_U8
548 // 8bit unsigned
549 unsigned short sound[1024], monoBuffer[1024];
550 while(recording) {
551 result = read(dsp, sound, 1024); // 8192
552 // int j=0;
553 547
554 // if(systemZaurus) { 548 } else {
549 for (int i = 0; i < result; i++) { //since Z is mono do normally
550 monoBuffer[i] = sound[i];
551 }
555 552
556 for (int i = 0; i < result; i++) { //since Z is mono do normally 553 length+=write(wav, monoBuffer, result);
557 monoBuffer[i] = sound[i];
558 } 554 }
559 555 length +=bytesWritten;
560 length+=write(wav, monoBuffer, result);
561
562 // for (int i = 0; i < result; i+=2) {
563 // monoBuffer[j] = (sound[i]+sound[i+1])/2;
564 // j++;
565 // }
566 // length+=write(wav, monoBuffer, result/2);
567 length += result;
568 // printf("%d\r",length);
569 // fflush(stdout);
570 }
571
572 qApp->processEvents();
573 }
574
575 } else { // 16 bit only capabilities
576
577
578 msg.sprintf("Recording format other");
579 qDebug(msg);
580
581 signed short sound[1024];//, monoBuffer[512];
582
583 while(recording) {
584
585 result = read(dsp, sound, 1024); // 8192
586
587 write(wav, sound, result);
588 length += result;
589 556
590 if(length<0) { 557 if(length<0) {
591
592 recording=false; 558 recording=false;
593 perror("dev/dsp's is a lookin' messy"); 559 perror("dev/dsp's is a lookin' messy");
594 QMessageBox::message("Vmemo"," Done1 recording\n"+ fileName); 560 QMessageBox::message("Vmemo"," Done1 recording\n"+ fileName);
595 } 561 }
596 // printf("%d\r",length); 562 // printf("%d\r",length);
597 // fflush(stdout); 563 // fflush(stdout);
598 qApp->processEvents(); 564 qApp->processEvents();
599 } 565 }
600 // qDebug("file has length of %d lasting %d seconds", 566 // qDebug("file has length of %d lasting %d seconds",
601 // length, (( length / speed) / channels) / 2 ); 567 // length, (( length / speed) / channels) / 2 );
602 // medialplayer states wrong length in secs 568 // medialplayer states wrong length in secs
603 } 569 // }
604 570
605 //>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>><<<<<<<<<<<<<<<<<<<<<<<<<<<<// 571 //>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>><<<<<<<<<<<<<<<<<<<<<<<<<<<<//
606 572
607 value = length+36; 573 value = length+36;
608 574
609 lseek(wav, 4, SEEK_SET); 575 lseek(wav, 4, SEEK_SET);
610 write(wav, &value, 4); 576 write(wav, &value, 4);
611 lseek(wav, 40, SEEK_SET); 577 lseek(wav, 40, SEEK_SET);
612 578
613 write(wav, &length, 4); 579 write(wav, &length, 4);
614 580
615 track.close(); 581 track.close();
616 qDebug("Track closed"); 582 qDebug("Track closed");
617 583
618 if( ioctl( dsp, SNDCTL_DSP_RESET,0) == -1) 584 if( ioctl( dsp, SNDCTL_DSP_RESET,0) == -1)
619 perror("ioctl(\"SNDCTL_DSP_RESET\")"); 585 perror("ioctl(\"SNDCTL_DSP_RESET\")");
620 586
621 ::close(dsp); 587 ::close(dsp);
622 fileName = fileName.left(fileName.length()-4); 588 fileName = fileName.left(fileName.length()-4);
623 // if(useAlerts) 589 // if(useAlerts)
624 // QMessageBox::message("Vmemo"," Done1 recording\n"+ fileName); 590 // QMessageBox::message("Vmemo"," Done1 recording\n"+ fileName);
625 qDebug("done recording "+fileName); 591 qDebug("done recording "+fileName);
626 592
627// QSound::play(Resource::findSound("vmemoe")); 593// QSound::play(Resource::findSound("vmemoe"));