• 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 
41 struct 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 
57 KAudioRecordStream::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 
87 KAudioRecordStream::~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 
96 int 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 
127 void KAudioRecordStream::setBlockingIO( bool blocking )
128 {
129  d->blocking = blocking;
130 }
131 
132 bool KAudioRecordStream::blockingIO() const
133 {
134  return d->blocking;
135 }
136 
137 void KAudioRecordStream::usePolling( bool polling )
138 {
139  d->polling = polling;
140  if( ! polling )
141  flush();
142 }
143 
144 bool KAudioRecordStream::polling() const
145 {
146  return d->polling;
147 }
148 
149 Arts::StereoEffectStack KAudioRecordStream::effectStack() const
150 {
151  return d->effectStack;
152 }
153 
154 bool KAudioRecordStream::running() const
155 {
156  return d->attached;
157 }
158 
159 void 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 
178 void 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 
214 void KAudioRecordStream::flush()
215 {
216  kdDebug( 400 ) << k_funcinfo << endl;
217  d->inqueue.clear();
218 }
219 
220 void KAudioRecordStream::slotRestartedServer() { }
221 
222 void 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 
247 KByteSoundReceiver::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 
255 KByteSoundReceiver::~KByteSoundReceiver()
256 {
257 }
258 
259 void 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)
endl
kndbgstream & endl(kndbgstream &s)
kdWarning
kdbgstream kdWarning(int area=0)
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.1
This website is maintained by Timothy Pearson.