source: trunk/src/testing/src/sageAudioModule.cpp @ 4

Revision 4, 14.3 KB checked in by ajaworski, 13 years ago (diff)

Added modified SAGE sources

Line 
1/******************************************************************************
2 * SAGE - Scalable Adaptive Graphics Environment
3 *
4 * Module   :  sageAudioModule.cpp
5 *   Author   :   Hyejung Hur
6 *   Description:   Code file for managing audio module-create audio, play, capture, save it
7 *   
8 * Copyright (C) 2004 Electronic Visualization Laboratory,
9 * University of Illinois at Chicago
10 *
11 * All rights reserved.
12 *
13 * Redistribution and use in source and binary forms, with or without
14 * modification, are permitted provided that the following conditions are met:
15 *
16 *  * Redistributions of source code must retain the above copyright
17 *    notice, this list of conditions and the following disclaimer.
18 *  * Redistributions in binary form must reproduce the above
19 *    copyright notice, this list of conditions and the following disclaimer
20 *    in the documentation and/or other materials provided with the distribution.
21 *  * Neither the name of the University of Illinois at Chicago nor
22 *    the names of its contributors may be used to endorse or promote
23 *    products derived from this software without specific prior written permission.
24 *
25 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
26 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
27 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
28 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
29 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
30 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
31 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
32 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
33 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
34 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
35 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
36 *
37 * Direct questions, comments etc about SAGE to sage_users@listserv.uic.edu or
38 * http://www.evl.uic.edu/cavern/forum/
39 *
40***************************************************************************************************************************/
41
42#include "sageAudioModule.h"
43#include "sageAudio.h"
44#include "sail.h"
45
46sageAudioModule* sageAudioModule::_instance = NULL;
47
48sageAudioModule::sageAudioModule()
49: fileReader(NULL), fileWriter(NULL), formatManager(NULL), gFrameNum(0)
50{
51   audioList.clear();
52   PaError err = Pa_Initialize();
53   if( err != paNoError ) {
54      std::cerr << "portaudio could not initializ" << std::endl;
55   }
56}
57
58sageAudioModule::~sageAudioModule()
59{
60   if(fileWriter != NULL) {
61      fileWriter->stop();
62   }
63   
64   if(fileReader != NULL) {
65      fileReader->stop();
66   }
67   
68   sage::usleep(1000);     
69
70   std::vector<sageAudio*>::iterator iter;
71   sageAudio* audio = NULL;
72   for(iter = audioList.begin(); iter != audioList.end(); iter++)
73   {
74      std::cout << "-------------------> 2" << std::endl;
75      audio = (sageAudio*) *iter;
76      audio->stop();
77      audio->closeStream();
78   }
79
80   Pa_Terminate();
81   sage::usleep(2000);   
82     
83   for(iter = audioList.begin(); iter != audioList.end(); iter++)
84   {
85      audio = (sageAudio*) *iter;
86      delete audio;
87      audio = NULL;     
88   }
89   audioList.clear();
90
91   if(fileReader != NULL) {
92      delete fileReader;
93      fileReader = NULL;
94   }
95   
96   if(fileWriter != NULL) {
97      delete fileWriter;
98      fileWriter = NULL;
99   }
100   
101   if(formatManager != NULL) {
102      delete formatManager;
103      formatManager = NULL;
104   }
105
106   std::vector<sageAudioCircBuf*>::iterator iterBuffer;
107   sageAudioCircBuf* buffer = NULL;
108   for(iterBuffer = bufferList.begin(); iterBuffer != bufferList.end(); iterBuffer++)
109   {
110      buffer = (sageAudioCircBuf*) *iterBuffer;
111      delete buffer;
112      buffer = NULL;     
113   }
114   bufferList.clear();
115}
116
117
118sageAudioModule* sageAudioModule::instance()
119{
120   if(_instance == NULL) {
121      _instance = new sageAudioModule();
122   }
123   return _instance;
124}
125
126void sageAudioModule::init(sailConfig &conf)
127{
128   config.deviceNum = conf.audioDeviceNum;
129   config.sampleFmt = conf.sampleFmt;
130   config.samplingRate = conf.samplingRate;
131   config.channels = conf.channels;
132   config.framePerBuffer = conf.framePerBuffer;
133   config.audioMode = conf.audioMode;
134
135   init();
136}
137
138void sageAudioModule::init(sageAudioConfig &conf)
139{
140   config.deviceNum = conf.deviceNum;
141   config.sampleFmt = conf.sampleFmt;
142   config.samplingRate = conf.samplingRate;
143   config.channels = conf.channels;
144   config.framePerBuffer = conf.framePerBuffer;
145   config.audioMode = conf.audioMode;
146   
147   init();
148}
149
150void sageAudioModule::init()
151{
152   // create audio format manager
153   if(formatManager != NULL) {
154      delete formatManager;
155      formatManager = NULL;
156   }
157   formatManager = new audioFormatManager();
158   
159   // create objects for reading and writing audio files
160   if(fileReader != NULL) {
161      delete fileReader;
162      fileReader = NULL;
163   }
164   fileReader = new audioFileReader(formatManager);
165   fileReader->init();
166     
167   if(fileWriter != NULL) {
168      delete fileWriter;
169      fileWriter = NULL;
170   }
171   fileWriter = new audioFileWriter(formatManager);
172   fileWriter->init();
173   
174   std::cout << "sageAudioModule::init: initialized" << std::endl;
175
176}
177
178sageAudioConfig* sageAudioModule::getAudioConfig()
179{
180   return &config;
181}
182
183void sageAudioModule::updateConfig(sageAudioConfig &conf)
184{
185   config.deviceNum = conf.deviceNum;
186   config.sampleFmt = conf.sampleFmt;
187   config.samplingRate = conf.samplingRate;
188   config.channels = conf.channels;
189   config.framePerBuffer = conf.framePerBuffer;
190   config.audioMode = conf.audioMode;
191   
192   //std::cout << "----" << conf.framePerBuffer << std::endl;
193}
194
195sageAudioCircBuf* sageAudioModule::load(char* filename, bool loop, int nframes, long totalframes)
196{
197   /** todo */
198   // give the loading job to fileReader
199   if(fileReader != NULL) {
200      return (fileReader->load(filename, loop, nframes, totalframes));
201   }
202   
203   return NULL;
204}
205
206int sageAudioModule::save(char* filename)
207{
208   /** todo */
209   // give the loading job to fileReader
210   if(fileWriter != NULL) {
211      fileWriter->write(filename, config, bufferList[0]);   // need to change...
212   }
213   
214   return 0;
215}
216
217int sageAudioModule::play(int id)
218{
219   sageAudio* audio = NULL;
220   if(config.audioMode == SAGE_AUDIO_CAPTURE || config.audioMode == SAGE_AUDIO_FWCAPTURE || config.audioMode == SAGE_AUDIO_PLAY) {
221      std::vector<sageAudio*>::iterator iter;
222          std::cout << "audioList size = " << audioList.size() << std::endl;
223          for( iter = audioList.begin(); iter != audioList.end(); iter++)
224      {
225         audio = (sageAudio*) *iter;
226                 std::cout << "audio id = " << id << " " << audio->getID() << "?" << std::endl;
227         if(audio->getID() == id)
228         {
229            audio->play();
230            return 0;
231         }
232      }
233   }
234   
235   if(config.audioMode == SAGE_AUDIO_READ) {
236      fileReader->start();
237   } else if(config.audioMode == SAGE_AUDIO_WRITE) {
238      fileWriter->start();
239   }         
240
241   // for testing
242   /*f(config.audioMode == SAGE_AUDIO_APP) {
243      fileWriter->start();
244   }*/
245
246   if(config.audioMode == SAGE_AUDIO_PLAY) {
247      // find it from buffer
248      std::vector<sageAudioCircBuf*>::iterator iterBuffer;
249      sageAudioCircBuf* temp = NULL;
250      for(iterBuffer = bufferList.begin(); iterBuffer != bufferList.end(); iterBuffer++)
251      {
252         temp = (sageAudioCircBuf*) *iterBuffer;
253         if(temp->getAudioId() == id)
254         {
255            break;
256         }
257      }
258      // apply it to audio
259      if((temp != NULL) && (audioList.size() > 0))
260      {
261                 std::cout << " audio id " << temp->getAudioId() << std::endl;
262         audio = audioList[0];
263         audio->reset(id, temp);
264         audio->openStream();
265         audio->play();
266      }
267   }
268
269   return 0;
270}
271
272int sageAudioModule::pause(int id)
273{
274   if(config.audioMode == SAGE_AUDIO_CAPTURE || config.audioMode == SAGE_AUDIO_PLAY) {
275      std::vector<sageAudio*>::iterator iter;
276      sageAudio* audio = NULL;
277      for( iter = audioList.begin(); iter != audioList.end(); iter++)
278      {
279         audio = (sageAudio*) *iter;
280         if(audio->getID() == id)
281         {
282            audio->pause();
283         }
284      }
285   }
286   else if(config.audioMode == SAGE_AUDIO_READ) {
287      //fileReader->();
288   }
289   else if(config.audioMode == SAGE_AUDIO_WRITE) {
290   }   
291   
292   return 0;
293}
294
295int sageAudioModule::stop(int id)
296{
297   sageAudio* audio = NULL;
298   if(config.audioMode == SAGE_AUDIO_CAPTURE || config.audioMode == SAGE_AUDIO_PLAY) {
299      std::vector<sageAudio*>::iterator iter;
300      for( iter = audioList.begin(); iter != audioList.end(); iter++)
301      {
302         audio = (sageAudio*) *iter;
303         if(audio->getID() == id)
304         {
305            audio->stop();
306            audio->closeStream();
307         }
308      }
309   }
310   else if(config.audioMode == SAGE_AUDIO_READ) {
311      fileReader->stop();
312   }
313   else if(config.audioMode == SAGE_AUDIO_WRITE) {
314   }
315
316   if(config.audioMode == SAGE_AUDIO_PLAY) {
317      // delete buffer
318      // audio create for 
319      if(audio != NULL)
320      {
321         // find buffer and delete it
322         std::vector<sageAudioCircBuf*>::iterator iterBuffer;
323         sageAudioCircBuf* temp = NULL;
324                 std::cout << "bufferlist size = " << bufferList.size() << " id "<< std::endl;
325         for(iterBuffer = bufferList.begin(); iterBuffer != bufferList.end(); iterBuffer++)
326         {
327            temp = (sageAudioCircBuf*) *iterBuffer;
328                         std::cout << "buffer  : " << temp->getAudioId() << " " << audio->getID() << std::endl;
329            //if(temp->getAudioId() == audio->getID())
330                        if(temp->getAudioId() == id)
331            {
332               bufferList.erase(iterBuffer);
333               break;
334            }
335         }
336         
337                 std::cout << "bufferlist size = " << bufferList.size() << std::endl;
338         // check buffer size
339         // if buffer size is still more then one
340         if(bufferList.size() > 0)
341         {
342            // return next buffer's audio id
343                         std::cout << "return  : " << bufferList[0]->getAudioId() << std::endl;
344            return bufferList[0]->getAudioId();
345         } else
346         {
347                        std::cout << "delete audio" << std::endl;
348            delete audio;
349            audio = NULL;
350            audioList.clear();
351         }
352      }
353   }
354   
355   return -1;
356}
357
358void sageAudioModule::testDevices()
359{
360   std::vector<sageAudio*>::iterator iter;
361   sageAudio* audio = NULL;
362   iter = audioList.begin();
363   audio = (sageAudio*) *iter;
364   if(audio != NULL)
365   {
366      audio->testDevices();
367   }
368}
369
370std::vector<sageAudioCircBuf*>& sageAudioModule::getBufferList(void)
371{
372   return bufferList;
373}
374
375sageAudioCircBuf* sageAudioModule::createObject(int instID)
376{
377   return createObject(config, instID);
378}
379
380sageAudioCircBuf* sageAudioModule::createObject(sageAudioConfig &conf, int instID)
381{
382   int id = bufferList.size();
383   if(instID >= 0)
384           id = instID;
385
386   // create shared circular buffer for audio data
387   sageAudioCircBuf *objectBuffer= new sageAudioCircBuf();
388   int bufferBlockNum = 16;
389   //int bufferBlockNum = 64;
390   int newBufSize = conf.framePerBuffer * conf.channels;
391
392   int err = -1;
393   // according to mode, create objects and set init values to the objects
394   // create audio
395   sageAudio* audio = NULL;
396   if(conf.audioMode == SAGE_AUDIO_CAPTURE)   
397   {
398      objectBuffer->init(id, bufferBlockNum, conf.sampleFmt, newBufSize);
399      audio = new sageAudio();
400      err = audio->init(id, conf, SAGE_AUDIO_CAPTURE, objectBuffer);
401      if(err <0) {
402         delete objectBuffer;
403         delete audio;
404         objectBuffer = NULL;
405         audio = NULL;
406         std::cerr << "sageAudioModule::createObject: failed" << std::endl;
407         return NULL;
408      }
409      audio->openStream();   
410      std::cout << "sageAudioModule::createObject: audio object is created" << std::endl;
411   } 
412   else if(conf.audioMode == SAGE_AUDIO_PLAY)
413   {
414      conf.sampleFmt = SAGE_SAMPLE_FLOAT32;
415      objectBuffer->init(id, bufferBlockNum, conf.sampleFmt, newBufSize);
416      if(audioList.size() == 0)
417      {
418         audio = new sageAudio();
419         err = audio->init(id, conf, SAGE_AUDIO_PLAY, objectBuffer);
420         if(err <0) {
421            delete objectBuffer;
422            delete audio;
423            objectBuffer = NULL;
424            audio = NULL;
425            std::cerr << "sageAudioModule::createObject: failed" << std::endl;
426            return NULL;
427         }
428         audio->openStream();   
429         std::cout << "sageAudioModule::createObject: audio object is created" << std::endl;
430      }
431      else
432      {
433         std::cout << "sageAudioModule::createObject: audio buffer is created" << std::endl;
434      }         
435   }
436   else if(conf.audioMode == SAGE_AUDIO_FWCAPTURE)
437   {
438      objectBuffer->init(id, bufferBlockNum, conf.sampleFmt, newBufSize);
439      audio = new sageAudio();
440      err = audio->init(id, conf, SAGE_AUDIO_FWCAPTURE, objectBuffer);
441      if(err <0) {
442         delete objectBuffer;
443         delete audio;
444         objectBuffer = NULL;
445         audio = NULL;
446         std::cerr << "sageAudioModule::createObject: failed" << std::endl;
447         return NULL;
448      }
449      audio->openStream();   
450      std::cout << "sageAudioModule::createObject: audio object is created" << std::endl;
451   }
452
453   bufferList.push_back(objectBuffer);   
454   if(audio)
455      audioList.push_back(audio);
456   
457   return objectBuffer;
458   
459}   
460
461int sageAudioModule::deleteObject(int id)
462{
463
464   stop(id);
465   /** todo */
466   // delete object
467   // delete buffer
468   // remove from the list
469   
470   return 0;
471}
472
473sageAudioCircBuf* sageAudioModule::createBuffer(int instID)
474{   
475   return createBuffer(config);
476}
477
478sageAudioCircBuf* sageAudioModule::createBuffer(sageAudioConfig &conf, int size, int instID)
479{
480   int id = -1;
481   if(instID >= 0)
482           id = instID;
483
484   // create shared circular buffer for audio data
485   sageAudioCircBuf *objectBuffer= new sageAudioCircBuf();
486   //int bufferBlockNum = 16;
487   int bufferBlockNum = size;
488   int newBufSize = conf.framePerBuffer * conf.channels;
489   objectBuffer->init(id, bufferBlockNum, conf.sampleFmt, newBufSize);
490
491   bufferList.push_back(objectBuffer);   
492   
493   std::cout << "sageAudioModule::createBuffer: audio buffer is created" << std::endl;
494
495        config.sampleFmt = conf.sampleFmt;
496        config.samplingRate = conf.samplingRate;
497        config.channels = conf.channels;
498        config.framePerBuffer = conf.framePerBuffer;
499   
500   return objectBuffer;
501   
502}   
503
504void sageAudioModule::setgFrameNum(long frames)
505{
506   gFrameNum = frames;
507}
508long sageAudioModule::getgFrameNum()
509{
510   return gFrameNum;
511}
Note: See TracBrowser for help on using the repository browser.