-rw-r--r-- | core/applets/vmemo/moc_vmemo.cpp | 95 | ||||
-rw-r--r-- | core/applets/vmemo/opie-vmemo.control | 9 | ||||
-rwxr-xr-x | core/applets/vmemo/qpe-vmemo.postinst | 2 | ||||
-rwxr-xr-x | core/applets/vmemo/qpe-vmemo.postrm | 2 | ||||
-rw-r--r-- | core/applets/vmemo/vmemo.cpp | 360 | ||||
-rw-r--r-- | core/applets/vmemo/vmemo.h | 50 | ||||
-rw-r--r-- | core/applets/vmemo/vmemo.pro | 11 | ||||
-rw-r--r-- | core/applets/vmemo/vmemoimpl.cpp | 59 | ||||
-rw-r--r-- | core/applets/vmemo/vmemoimpl.h | 41 |
9 files changed, 629 insertions, 0 deletions
diff --git a/core/applets/vmemo/moc_vmemo.cpp b/core/applets/vmemo/moc_vmemo.cpp new file mode 100644 index 0000000..7e68ac1 --- a/dev/null +++ b/core/applets/vmemo/moc_vmemo.cpp @@ -0,0 +1,95 @@ +/**************************************************************************** +** VMemo meta object code from reading C++ file 'vmemo.h' +** +** Created: Wed Feb 13 17:52:12 2002 +** by: The Qt MOC ($Id$) +** +** WARNING! All changes made in this file will be lost! +*****************************************************************************/ + +#if !defined(Q_MOC_OUTPUT_REVISION) +#define Q_MOC_OUTPUT_REVISION 9 +#elif Q_MOC_OUTPUT_REVISION != 9 +#error "Moc format conflict - please regenerate all moc files" +#endif + +#include "vmemo.h" +#include <qmetaobject.h> +#include <qapplication.h> + + + +const char *VMemo::className() const +{ + return "VMemo"; +} + +QMetaObject *VMemo::metaObj = 0; + +void VMemo::initMetaObject() +{ + if ( metaObj ) + return; + if ( qstrcmp(QWidget::className(), "QWidget") != 0 ) + badSuperclassWarning("VMemo","QWidget"); + (void) staticMetaObject(); +} + +#ifndef QT_NO_TRANSLATION + +QString VMemo::tr(const char* s) +{ + return qApp->translate( "VMemo", s, 0 ); +} + +QString VMemo::tr(const char* s, const char * c) +{ + return qApp->translate( "VMemo", s, c ); +} + +#endif // QT_NO_TRANSLATION + +QMetaObject* VMemo::staticMetaObject() +{ + if ( metaObj ) + return metaObj; + (void) QWidget::staticMetaObject(); +#ifndef QT_NO_PROPERTIES +#endif // QT_NO_PROPERTIES + typedef void (VMemo::*m1_t0)(); + typedef void (QObject::*om1_t0)(); + typedef void (VMemo::*m1_t1)(QMouseEvent*); + typedef void (QObject::*om1_t1)(QMouseEvent*); + typedef void (VMemo::*m1_t2)(QMouseEvent*); + typedef void (QObject::*om1_t2)(QMouseEvent*); + m1_t0 v1_0 = &VMemo::record; + om1_t0 ov1_0 = (om1_t0)v1_0; + m1_t1 v1_1 = &VMemo::mousePressEvent; + om1_t1 ov1_1 = (om1_t1)v1_1; + m1_t2 v1_2 = &VMemo::mouseReleaseEvent; + om1_t2 ov1_2 = (om1_t2)v1_2; + QMetaData *slot_tbl = QMetaObject::new_metadata(3); + QMetaData::Access *slot_tbl_access = QMetaObject::new_metaaccess(3); + slot_tbl[0].name = "record()"; + slot_tbl[0].ptr = (QMember)ov1_0; + slot_tbl_access[0] = QMetaData::Public; + slot_tbl[1].name = "mousePressEvent(QMouseEvent*)"; + slot_tbl[1].ptr = (QMember)ov1_1; + slot_tbl_access[1] = QMetaData::Public; + slot_tbl[2].name = "mouseReleaseEvent(QMouseEvent*)"; + slot_tbl[2].ptr = (QMember)ov1_2; + slot_tbl_access[2] = QMetaData::Public; + metaObj = QMetaObject::new_metaobject( + "VMemo", "QWidget", + slot_tbl, 3, + 0, 0, +#ifndef QT_NO_PROPERTIES + 0, 0, + 0, 0, +#endif // QT_NO_PROPERTIES + 0, 0 ); + metaObj->set_slot_access( slot_tbl_access ); +#ifndef QT_NO_PROPERTIES +#endif // QT_NO_PROPERTIES + return metaObj; +} diff --git a/core/applets/vmemo/opie-vmemo.control b/core/applets/vmemo/opie-vmemo.control new file mode 100644 index 0000000..0ddb45e --- a/dev/null +++ b/core/applets/vmemo/opie-vmemo.control @@ -0,0 +1,9 @@ +Files: plugins/applets/libvmemoapplet.so* pics/vmemo/* sounds/vmemo*.wav +Priority: optional +Section: opie/system +Maintainer: Jeremy Cowgar <jc@cowgar.com> +Architecture: arm +Version: $QPE_VERSION-$SUB_VERSION +Depends: opie-base ($QPE_VERSION) +Description: Voice Memo Recorder Applet + The voice memo recorder for the Opie environment diff --git a/core/applets/vmemo/qpe-vmemo.postinst b/core/applets/vmemo/qpe-vmemo.postinst new file mode 100755 index 0000000..ba76ffa --- a/dev/null +++ b/core/applets/vmemo/qpe-vmemo.postinst @@ -0,0 +1,2 @@ +#!/bin/sh +/opt/QtPalmtop/bin/qcop QPE/TaskBar "reloadApplets()" diff --git a/core/applets/vmemo/qpe-vmemo.postrm b/core/applets/vmemo/qpe-vmemo.postrm new file mode 100755 index 0000000..ba76ffa --- a/dev/null +++ b/core/applets/vmemo/qpe-vmemo.postrm @@ -0,0 +1,2 @@ +#!/bin/sh +/opt/QtPalmtop/bin/qcop QPE/TaskBar "reloadApplets()" diff --git a/core/applets/vmemo/vmemo.cpp b/core/applets/vmemo/vmemo.cpp new file mode 100644 index 0000000..6f04c66 --- a/dev/null +++ b/core/applets/vmemo/vmemo.cpp @@ -0,0 +1,360 @@ +/**************************************************************************************94x78** +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +*********************************************************************************************/ + +/* + * $Id$ + */ + +#include <sys/time.h> +#include <sys/types.h> +#include <unistd.h> +#include <stdio.h> +#include <sys/stat.h> +#include <fcntl.h> +#include <sys/ioctl.h> +#include <linux/soundcard.h> +#include <string.h> +#include <stdlib.h> + +typedef struct _waveheader { + u_long main_chunk; /* 'RIFF' */ + u_long length; /* filelen */ + u_long chunk_type; /* 'WAVE' */ + + u_long sub_chunk; /* 'fmt ' */ + u_long sc_len; /* length of sub_chunk, =16 (chunckSize) */ + u_short format; /* should be 1 for PCM-code (formatTag) */ + u_short modus; /* 1 Mono, 2 Stereo (channels) */ + u_long sample_fq; /* samples per second (samplesPerSecond) */ + u_long byte_p_sec; /* avg bytes per second (avgBytePerSecond) */ + u_short byte_p_spl; /* samplesize; 1 or 2 bytes (blockAlign) */ + u_short bit_p_spl; /* 8, 12 or 16 bit (bitsPerSample) */ + + u_long data_chunk; /* 'data' */ + u_long data_length; /* samplecount */ +} WaveHeader; + +#define RIFF 0x46464952 +#define WAVE 0x45564157 +#define FMT 0x20746D66 +#define DATA 0x61746164 +#define PCM_CODE 1 +#define WAVE_MONO 1 +#define WAVE_STEREO 2 + +#include "vmemo.h" + +#include <qpe/qpeapplication.h> +#include <qpe/resource.h> +#include <qpe/config.h> + +#include <qpainter.h> +#include <qdatetime.h> +#include <qsound.h> +#include <qfile.h> + +int seq = 0; + +/* XPM */ +static char * vmemo_xpm[] = { +"14 14 47 1", +" c None", +". c #101010", +"+ c #0D0D0D", +"@ c #0B0B0B", +"# c #393939", +"$ c #6C6C6C", +"% c #5D5D5D", +"& c #4E4E4E", +"* c #1C1C1C", +"= c #131313", +"- c #7B7B7B", +"; c #303030", +"> c #383838", +", c #3F3F3F", +"' c #343434", +") c #060606", +"! c #444444", +"~ c #646464", +"{ c #505050", +"] c #717171", +"^ c #1B1B1B", +"/ c #585858", +"( c #4C4C4C", +"_ c #353535", +": c #0E0E0E", +"< c #080808", +"[ c #262626", +"} c #121212", +"| c #7F7F7F", +"1 c #464646", +"2 c #0C0C0C", +"3 c #727272", +"4 c #292929", +"5 c #656565", +"6 c #565656", +"7 c #434343", +"8 c #272727", +"9 c #0F0F0F", +"0 c #3A3A3A", +"a c #090909", +"b c #535353", +"c c #545454", +"d c #494949", +"e c #7A7A7A", +"f c #202020", +"g c #3D3D3D", +"h c #1F1F1F", +" .+@ ", +" #$%&* ", +" =-;>,')", +" .$;!~,)", +" ;#{]!)", +" ^~/(_)", +" ./:@<[)", +" }. .|]1;;2 ", +" #-$;^/3&;;4@ ", +".$;;#5:67;89 ", +":%;0%&ab;8. ", +"@cd%e!fg49 ", +" h0,!_;2@ ", +" ))))) "}; + +VMemo::VMemo( QWidget *parent, const char *name ) + : QWidget( parent, name ) +{ + setFixedHeight( 18 ); + setFixedWidth( 14 ); + + recording = FALSE; +} + +VMemo::~VMemo() +{ +} + +void VMemo::paintEvent( QPaintEvent* ) +{ + QPainter p(this); + p.drawPixmap( 0, 1,( const char** ) vmemo_xpm ); +} + +void VMemo::mousePressEvent( QMouseEvent * ) +{ + qWarning("VMemo::mousePress()"); + QSound::play(Resource::findSound("vmemob")); + + recording = TRUE; + qWarning("VMemo::mousePress() -> Starting to record"); + if (openDSP() == -1) + { + // ### Display an error box + qWarning("VMemo::mousePress() -> DSP error"); + recording = FALSE; + return; + } + + Config vmCfg("VMemo"); + vmCfg.setGroup("Defaults"); + + QDateTime dt = QDateTime::currentDateTime(); + +#if defined(QT_QWS_EBX) //if zaurus + QString fileName(vmCfg.readEntry("Dir", "/mnt/cf/")); // zaurus does not have /mnt/ramfs +#else + QString fileName(vmCfg.readEntry("Dir", "/mnt/ramfs/")); +#endif + + fileName += "vm_"; + fileName += dt.toString(); + fileName += ".wav"; + + // No spaces in the filename + fileName.replace(QRegExp("'"),""); + fileName.replace(QRegExp(" "),"_"); + fileName.replace(QRegExp(":"),"."); + fileName.replace(QRegExp(","),""); + + if(openWAV(fileName.latin1()) == -1) + { + // ### Display an error box + qWarning("VMemo::mousePress() -> WAV error"); + close(dsp); + return; + } + + QArray<int> cats(1); + cats[0] = vmCfg.readNumEntry("Category", 0); + + QString dlName("vm_"); + dlName += dt.toString(); + DocLnk l; + l.setFile(fileName); + l.setName(dlName); + l.setType("audio/x-wav"); + l.setCategories(cats); + l.writeLink(); + + record(); +} + +void VMemo::mouseReleaseEvent( QMouseEvent * ) +{ + qWarning("VMemo::mouseRelese() -> Done recording"); + recording = FALSE; + QSound::play(Resource::findSound("vmemoe")); +} + +int VMemo::openDSP() +{ + Config cfg("Sound"); + cfg.setGroup("Record"); + + speed = cfg.readNumEntry("SampleRate", 11025); + channels = cfg.readNumEntry("Stereo", 1) ? 2 : 1; // 1 = stereo(2), 0 = mono(1) + if (cfg.readNumEntry("SixteenBit", 1)) + { + format = AFMT_S16_LE; + resolution = 16; + } + else + { + format = AFMT_U8; + resolution = 8; + } + +#if defined(QT_QWS_EBX) //if zaurus + //dsp = open("/dev/dsp1", O_RDONLY); //on the Zaurus this needs to be /dev/dsp1 !!!! + dsp = open("/dev/dsp1", O_RDWR); //on the Zaurus this needs to be /dev/dsp1 !!!! +#else + //dsp = open("/dev/dsp", O_RDONLY); + dsp = open("/dev/dsp", O_RDWR); +#endif + + qWarning("speed = %i", speed); + + if(dsp == -1) + { + perror("open(\"/dev/dsp\")"); + return -1; + } + + if(ioctl(dsp, SNDCTL_DSP_SETFMT , &format)==-1) { + perror("ioctl(\"SNDCTL_DSP_SETFMT\")"); + return -1; + } + if(ioctl(dsp, SNDCTL_DSP_CHANNELS , &channels)==-1) { + perror("ioctl(\"SNDCTL_DSP_CHANNELS\")"); + return -1; + } + if(ioctl(dsp, SNDCTL_DSP_SPEED , &speed)==-1) { + perror("ioctl(\"SNDCTL_DSP_SPEED\")"); + return -1; + } + if(ioctl(dsp, SOUND_PCM_READ_RATE , &rate)==-1) { + perror("ioctl(\"SOUND_PCM_READ_RATE\")"); + return -1; + } + qWarning("speed = %i", speed); + + return 1; +} + +int VMemo::openWAV(const char *filename) +{ + char buffer[256]; + + qDebug("Creating %s ",filename); + track.setName(filename); + if(!track.open(IO_WriteOnly|IO_Truncate|IO_Raw)) + { + qDebug("Could not open file"); + return -1; + } + wav=track.handle(); + + WaveHeader wh; + + /* + wh.main_chunk = RIFF; + wh.length = 0; + wh.chunk_type = WAVE; + wh.sub_chunk = FMT; + wh.sc_len = 16; + wh.format = PCM_CODE; + wh.modus = channels; + wh.sample_fq = speed; + wh.byte_p_spl = ((resolution == 8) ? 1 : 2) * (channels ? 2 : 1); + wh.byte_p_sec = resolution; //speed * wh.modus * wh.byte_p_spl; + wh.bit_p_spl = resolution; + wh.data_chunk = DATA; + wh.data_length= 0; + */ + + wh.main_chunk = RIFF; + wh.length = 0; + wh.chunk_type = WAVE; + + wh.sub_chunk = FMT; + wh.sc_len = 16; + wh.format = PCM_CODE; + wh.modus = channels; + wh.sample_fq = speed; + wh.bit_p_spl = resolution; + wh.byte_p_sec = wh.sample_fq * wh.bit_p_spl; + wh.byte_p_spl = channels * (wh.bit_p_spl % 8); + + qWarning("channels = %i\n" + "samplesPerSecond = %i\n" + "avgBytesPerSecond = %i\n" + "blockAlign = %i\n" + "bitsPerSecond = %i\n", wh.modus, wh.sample_fq, wh.byte_p_sec, wh.byte_p_spl, wh.bit_p_spl); + + wh.data_chunk = DATA; + wh.data_length= 0; + + write (wav, &wh, sizeof(WaveHeader)); + + return 1; +} + +void VMemo::record(void) +{ + int length=0, result, value; + char sound[8192]; + + qWarning("VMemo::record()"); + + while(recording) + { + result = read(dsp, sound, 8192); + write(wav, sound, result); + length += result; + qApp->processEvents(); + } + + qWarning("VMemo::record() -> Done recording"); + qWarning("VMemo::record() -> Closing dsp"); + + value = length+36; + lseek(wav, 4, SEEK_SET); + write(wav, &value, 4); + lseek(wav, 40, SEEK_SET); + write(wav, &length, 4); + track.close(); + + if( ioctl( dsp, SNDCTL_DSP_RESET,0) == -1)// ); //tell driver to stop for a while + perror("ioctl(\"SNDCTL_DSP_RESET\")"); + ::close(dsp); + + qWarning("VMemo::record() -> terminating"); +} diff --git a/core/applets/vmemo/vmemo.h b/core/applets/vmemo/vmemo.h new file mode 100644 index 0000000..9ce08f2 --- a/dev/null +++ b/core/applets/vmemo/vmemo.h @@ -0,0 +1,50 @@ +/**************************************************************************************94x78** +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +*********************************************************************************************/ + +/* + * $Id$ + */ + +#ifndef __VMEMO_H__ +#define __VMEMO_H__ + +#include <qwidget.h> +#include <qpixmap.h> +#include <qpe/applnk.h> +#include <qfile.h> + +class VMemo : public QWidget +{ + Q_OBJECT +public: + VMemo( QWidget *parent, const char *name = NULL); + ~VMemo(); + QFile track; +public slots: + void record(); + void mousePressEvent( QMouseEvent * ); + void mouseReleaseEvent( QMouseEvent * ); + +private: + void paintEvent( QPaintEvent* ); + + int openDSP(); + int openWAV(const char *filename); + + QPixmap vmemoPixmap; + + int dsp, wav, rate, speed, channels, format, resolution; + bool recording; +}; + +#endif // __VMEMO_H__ + diff --git a/core/applets/vmemo/vmemo.pro b/core/applets/vmemo/vmemo.pro new file mode 100644 index 0000000..bf9af4b --- a/dev/null +++ b/core/applets/vmemo/vmemo.pro @@ -0,0 +1,11 @@ +TEMPLATE = lib +CONFIG += qt warn_on release +HEADERS = vmemo.h vmemoimpl.h +SOURCES = vmemo.cpp vmemoimpl.cpp +TARGET = vmemoapplet +DESTDIR = ../../plugins/applets +INCLUDEPATH += $(OPIEDIR)/include +DEPENDPATH += ../$(OPIEDIR)/include +LIBS += -lqpe +VERSION = 1.0.0 + diff --git a/core/applets/vmemo/vmemoimpl.cpp b/core/applets/vmemo/vmemoimpl.cpp new file mode 100644 index 0000000..9e6c7cd --- a/dev/null +++ b/core/applets/vmemo/vmemoimpl.cpp @@ -0,0 +1,59 @@ +/**************************************************************************************94x78** +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +*********************************************************************************************/ + +/* + * $Id$ + */ + +#include "vmemo.h" +#include "vmemoimpl.h" + + +VMemoAppletImpl::VMemoAppletImpl() + : vmemo(0), ref(0) +{ +} + +VMemoAppletImpl::~VMemoAppletImpl() +{ + delete vmemo; +} + +QWidget *VMemoAppletImpl::applet( QWidget *parent ) +{ + if ( !vmemo ) + vmemo = new VMemo( parent ); + return vmemo; +} + +int VMemoAppletImpl::position() const +{ + return 6; +} + +QRESULT VMemoAppletImpl::queryInterface( const QUuid &uuid, QUnknownInterface **iface ) +{ + *iface = 0; + if ( uuid == IID_QUnknown ) + *iface = this; + else if ( uuid == IID_TaskbarApplet ) + *iface = this; + + if ( *iface ) + (*iface)->addRef(); + return QS_OK; +} + +Q_EXPORT_INTERFACE() +{ + Q_CREATE_INSTANCE( VMemoAppletImpl ) +} diff --git a/core/applets/vmemo/vmemoimpl.h b/core/applets/vmemo/vmemoimpl.h new file mode 100644 index 0000000..0b78609 --- a/dev/null +++ b/core/applets/vmemo/vmemoimpl.h @@ -0,0 +1,41 @@ +/**************************************************************************************94x78** +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +*********************************************************************************************/ + +/* + * $Id$ + */ + +#ifndef __VMEMOIMPLAPPLETIMPL_H__ +#define __VMEMOIMPLAPPLETIMPL_H__ + +#include <qpe/taskbarappletinterface.h> + +class VMemo; + +class VMemoAppletImpl : public TaskbarAppletInterface +{ +public: + VMemoAppletImpl(); + virtual ~VMemoAppletImpl(); + + QRESULT queryInterface( const QUuid&, QUnknownInterface** ); + Q_REFCOUNT + + virtual QWidget *applet( QWidget *parent ); + virtual int position() const; + +private: + VMemo *vmemo; + ulong ref; +}; + +#endif |