• Skip to content
  • Skip to link menu
Trinity API Reference
  • Trinity API Reference
  • arts
 

arts

  • arts
  • kde
kaudiorecordstream.cpp
1 /*
2
3 Copyright (C) 2001, 2002 Matthias Kretz
4 kretz@kde.org
5 2003 Arnold Krille
6 arnold@arnoldarts.de
7
8 This library is free software; you can redistribute it and/or
9 modify it under the terms of the GNU Library General Public
10 License as published by the Free Software Foundation; either
11 version 2 of the License, or (at your option) any later version.
12
13 This library is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 Library General Public License for more details.
17
18 You should have received a copy of the GNU Library General Public License
19 along with this library; see the file COPYING.LIB. If not, write to
20 the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
21 Boston, MA 02110-1301, USA.
22
23 */
24
25#include "kaudiorecordstream.h"
26#include "kaudiorecordstream_p.h"
27#include "kartsserver.h"
28
29#include <artsflow.h>
30#include <soundserver.h>
31
32#include <tdeglobal.h>
33#include <kdebug.h>
34
35#include <tqstring.h>
36#include <tqptrqueue.h>
37#include <tqcstring.h> //QByteArray
38
39#include <assert.h>
40
41struct KAudioRecordStream::Data
42{
43 Arts::Synth_AMAN_RECORD in;
44 Arts::AudioToByteStream convert;
45 Arts::StereoEffectStack effectStack;
46 Arts::ByteSoundReceiver receiver;
47 KByteSoundReceiver * receiver_base;
48 KArtsServer * kserver;
49 bool attached;
50 bool blocking;
51 bool polling;
52 unsigned int pos;
53 TQPtrQueue<TQByteArray> inqueue;
54 TQString title;
55};
56
57KAudioRecordStream::KAudioRecordStream( KArtsServer * kserver, const TQString & title, TQObject * parent, const char * name )
58 : TQObject( parent, name )
59 , d( new Data )
60{
61 d->kserver = kserver;
62 d->attached = false;
63 d->blocking = true;
64 d->polling = false;
65 d->pos = 0;
66 d->inqueue.setAutoDelete( true );
67 d->title = title;
68
69 connect( d->kserver, TQ_SIGNAL( restartedServer() ), TQ_SLOT( slotRestartedServer() ) );
70
71 d->in = Arts::DynamicCast( d->kserver->server().createObject( "Arts::Synth_AMAN_RECORD" ) );
72 d->effectStack = Arts::DynamicCast( d->kserver->server().createObject( "Arts::StereoEffectStack" ) );
73 d->convert = Arts::DynamicCast( d->kserver->server().createObject( "Arts::AudioToByteStream" ) );
74 if( d->in.isNull() )
75 kdFatal( 400 ) << "couldn't create a Synth_AMAN_RECORD on the aRts server\n";
76 if( d->effectStack.isNull() )
77 kdFatal( 400 ) << "couldn't create a StereoEffectStack on the aRts server\n";
78 if( d->convert.isNull() )
79 kdFatal( 400 ) << "couldn't create a AudioToByteStream on the aRts server\n";
80
81 d->in.title( ( const char * ) d->title.local8Bit() );
82 Arts::connect( d->in, d->effectStack );
83 d->in.start();
84 d->effectStack.start();
85}
86
87KAudioRecordStream::~KAudioRecordStream()
88{
89 d->receiver = Arts::ByteSoundReceiver::null();
90 // don't delete receiver_base because aRts takes care of that (in the line
91 // above)
92 d->receiver_base = 0;
93 delete d;
94}
95
96int KAudioRecordStream::read( char * buffer, int size )
97{
98 kdDebug( 400 ) << k_funcinfo << endl;
99 unsigned int remaining = size;
100 while( remaining )
101 {
102 if( d->blocking )
103 while( d->inqueue.isEmpty() )
104 Arts::Dispatcher::the()->ioManager()->processOneEvent( true );
105 else
106 {
107 if( d->inqueue.isEmpty() )
108 Arts::Dispatcher::the()->ioManager()->processOneEvent( false );
109 if( d->inqueue.isEmpty() )
110 return size - remaining;
111 }
112 TQByteArray * data = d->inqueue.head();
113 unsigned int tocopy = kMin( remaining, data->size() - d->pos );
114 memcpy( buffer, data->data() + d->pos, tocopy );
115 d->pos += tocopy;
116 buffer += tocopy;
117 remaining -= tocopy;
118 if( d->pos == data->size() )
119 {
120 d->inqueue.remove();
121 d->pos = 0;
122 }
123 }
124 return size;
125}
126
127void KAudioRecordStream::setBlockingIO( bool blocking )
128{
129 d->blocking = blocking;
130}
131
132bool KAudioRecordStream::blockingIO() const
133{
134 return d->blocking;
135}
136
137void KAudioRecordStream::usePolling( bool polling )
138{
139 d->polling = polling;
140 if( ! polling )
141 flush();
142}
143
144bool KAudioRecordStream::polling() const
145{
146 return d->polling;
147}
148
149Arts::StereoEffectStack KAudioRecordStream::effectStack() const
150{
151 return d->effectStack;
152}
153
154bool KAudioRecordStream::running() const
155{
156 return d->attached;
157}
158
159void KAudioRecordStream::stop()
160{
161 kdDebug( 400 ) << k_funcinfo << endl;
162 if( d->attached )
163 {
164 d->receiver.stop();
165 d->convert.stop();
166
167 Arts::disconnect( d->convert, d->receiver );
168 d->receiver = Arts::ByteSoundReceiver::null();
169 d->receiver_base = 0;
170
171 Arts::disconnect( d->effectStack, d->convert );
172
173 d->attached = false;
174 emit running( false );
175 }
176}
177
178void KAudioRecordStream::start( int samplingRate, int bits, int channels )
179{
180 kdDebug( 400 ) << k_funcinfo << "samplingRate: " << samplingRate << " bits: " << bits << " channels: " << channels << endl;
181 if( ! d->attached )
182 {
183 assert( d->kserver );
184
185 if( ( samplingRate < 500 || samplingRate > 2000000 )
186 || ( channels != 1 && channels != 2 ) || ( bits != 8 && bits != 16 ) )
187 {
188 kdWarning( 400 ) << "invalid stream parameters: rate=" << samplingRate << ", " << bits << " bit, " << channels << " channels\n";
189 }
190 else
191 {
192 d->convert.samplingRate( samplingRate );
193 d->convert.channels( channels );
194 d->convert.bits( bits );
195 Arts::connect( d->effectStack, d->convert );
196
197 d->receiver_base = new KByteSoundReceiver( samplingRate, bits, channels, d->title.local8Bit() );
198 d->receiver = Arts::ByteSoundReceiver::_from_base( d->receiver_base );
199 connect( d->receiver_base, TQ_SIGNAL( data( const char *, unsigned int ) ),
200 TQ_SLOT( slotData( const char *, unsigned int ) ) );
201 Arts::connect( d->convert, "outdata", d->receiver, "indata" );
202
203 d->convert.start();
204 d->receiver.start();
205
206 //### needed?
207 Arts::Dispatcher::the()->ioManager()->processOneEvent( false );
208 d->attached = true;
209 emit running( true );
210 }
211 }
212}
213
214void KAudioRecordStream::flush()
215{
216 kdDebug( 400 ) << k_funcinfo << endl;
217 d->inqueue.clear();
218}
219
220void KAudioRecordStream::slotRestartedServer() { }
221
222void KAudioRecordStream::slotData( const char * contents, unsigned int size )
223{
224 //kdDebug( 400 ) << k_funcinfo << endl;
225 TQByteArray * bytearray = new TQByteArray( size );
226 // copy the contents to the bytearray
227 // this has to be deleted later
228 bytearray->duplicate( contents, size );
229 if( d->polling )
230 {
231 kdDebug( 400 ) << "enqueue the data\n";
232 d->inqueue.enqueue( bytearray );
233 }
234 else
235 {
236 //kdDebug( 400 ) << "emit the data\n";
237 emit data( *bytearray );
238 //kdDebug( 400 ) << "delete the data\n";
239 delete bytearray;
240 }
241}
242
244// ---*--- KByteSoundReceiver ---*--- //
246
247KByteSoundReceiver::KByteSoundReceiver( int rate, int bits, int channels, const char * title )
248 : _samplingRate( rate )
249 , _bits( bits )
250 , _channels( channels )
251 , _title( title )
252{
253}
254
255KByteSoundReceiver::~KByteSoundReceiver()
256{
257}
258
259void KByteSoundReceiver::process_indata( Arts::DataPacket<Arts::mcopbyte> * inpacket )
260{
261 //kdDebug( 400 ) << k_funcinfo << " size of the packet: " << inpacket->size << endl;
262 emit data( (char *)inpacket->contents, inpacket->size );
263 inpacket->processed();
264}
265#include "kaudiorecordstream.moc"
266#include "kaudiorecordstream_p.moc"
KArtsServer
KArtsServer is a wrapper to conveniently get a reference to a SoundServer, and restart artsd when nec...
Definition: kartsserver.h:38
KAudioRecordStream::polling
bool polling() const
read whether polling is enabled
Definition: kaudiorecordstream.cpp:144
KAudioRecordStream::flush
void flush()
flush input buffer
Definition: kaudiorecordstream.cpp:214
KAudioRecordStream::setBlockingIO
void setBlockingIO(bool)
If you set blockingIO to true the read method will wait until it has enough data to return exactly wh...
Definition: kaudiorecordstream.cpp:127
KAudioRecordStream::stop
void stop()
Detaches the stream from the soundserver but doesn't remove the Synth_AMAN_RECORD so that the entry i...
Definition: kaudiorecordstream.cpp:159
KAudioRecordStream::data
void data(TQByteArray &data)
Data from the aRts server has arrived.
KAudioRecordStream::blockingIO
bool blockingIO() const
read blocking I/O setting
Definition: kaudiorecordstream.cpp:132
KAudioRecordStream::usePolling
void usePolling(bool)
If you want to poll for data using read() set this to true.
Definition: kaudiorecordstream.cpp:137
KAudioRecordStream::running
bool running() const
Definition: kaudiorecordstream.cpp:154
KAudioRecordStream::effectStack
Arts::StereoEffectStack effectStack() const
Definition: kaudiorecordstream.cpp:149
KAudioRecordStream::KAudioRecordStream
KAudioRecordStream(KArtsServer *server, const TQString &title, TQObject *parent=0, const char *name=0)
Construct a KAudioRecordStream.
Definition: kaudiorecordstream.cpp:57
KAudioRecordStream::read
int read(char *, int size)
You can read size number of bytes.
Definition: kaudiorecordstream.cpp:96
KAudioRecordStream::start
void start(int samplingRate, int bits, int channels)
Attach to the soundserver and start getting data to read.
Definition: kaudiorecordstream.cpp:178
kdFatal
kdbgstream kdFatal(int area=0)
kdWarning
kdbgstream kdWarning(int area=0)
endl
kndbgstream & endl(kndbgstream &s)
kdDebug
kdbgstream kdDebug(int area=0)

arts

Skip menu "arts"
  • Main Page
  • Alphabetical List
  • Class List
  • File List
  • Class Members
  • Related Pages

arts

Skip menu "arts"
  • arts
  • dcop
  • dnssd
  • interfaces
  •   kspeech
  •     interface
  •     library
  •   tdetexteditor
  • kate
  • kded
  • kdoctools
  • kimgio
  • kjs
  • libtdemid
  • libtdescreensaver
  • tdeabc
  • tdecmshell
  • tdecore
  • tdefx
  • tdehtml
  • tdeinit
  • tdeio
  •   bookmarks
  •   httpfilter
  •   kpasswdserver
  •   kssl
  •   tdefile
  •   tdeio
  •   tdeioexec
  • tdeioslave
  •   http
  • tdemdi
  •   tdemdi
  • tdenewstuff
  • tdeparts
  • tdeprint
  • tderandr
  • tderesources
  • tdespell2
  • tdesu
  • tdeui
  • tdeunittest
  • tdeutils
  • tdewallet
Generated for arts by doxygen 1.9.4
This website is maintained by Timothy Pearson.