/[svn]/linuxsampler/trunk/src/drivers/audio/AudioOutputDeviceCoreAudio.cpp
ViewVC logotype

Annotation of /linuxsampler/trunk/src/drivers/audio/AudioOutputDeviceCoreAudio.cpp

Parent Directory Parent Directory | Revision Log Revision Log


Revision 2427 - (hide annotations) (download)
Sat Mar 2 07:03:04 2013 UTC (11 years, 3 months ago) by persson
File size: 22480 byte(s)
* code refactoring: added a lock guard class for exception safe mutex
  handling and used it everywhere appropriate

1 iliev 1829 /***************************************************************************
2     * *
3     * LinuxSampler - modular, streaming capable sampler *
4     * *
5 persson 2427 * Copyright (C) 2009 - 2013 Grigor Iliev *
6 iliev 1829 * *
7     * This program is free software; you can redistribute it and/or modify *
8     * it under the terms of the GNU General Public License as published by *
9     * the Free Software Foundation; either version 2 of the License, or *
10     * (at your option) any later version. *
11     * *
12     * This program is distributed in the hope that it will be useful, *
13     * but WITHOUT ANY WARRANTY; without even the implied warranty of *
14     * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
15     * GNU General Public License for more details. *
16     * *
17     * You should have received a copy of the GNU General Public License *
18     * along with this program; if not, write to the Free Software *
19     * Foundation, Inc., 59 Temple Place, Suite 330, Boston, *
20     * MA 02111-1307 USA *
21     ***************************************************************************/
22    
23     #include "AudioOutputDeviceCoreAudio.h"
24    
25     #include "../../common/global_private.h"
26    
27     namespace LinuxSampler {
28    
29 iliev 1832 void AudioOutputDeviceCoreAudio::AudioQueueListener (
30     void *inUserData, AudioQueueRef inAQ, AudioQueuePropertyID inID
31     ) {
32     switch(inID) {
33     case kAudioQueueProperty_IsRunning:
34    
35     break;
36     case kAudioQueueProperty_CurrentDevice:
37    
38     break;
39     }
40     }
41    
42 iliev 1829 void AudioOutputDeviceCoreAudio::HandleOutputBuffer (
43     void *aqData,
44     AudioQueueRef inAQ,
45     AudioQueueBufferRef inBuffer
46     ) {
47     AQPlayerState* pAqData = (AQPlayerState*) aqData;
48     if (atomic_read(&(pAqData->mIsRunning)) == 0) {
49     AudioQueueFlush(pAqData->mQueue);
50     AudioQueueStop (pAqData->mQueue, true);
51     return;
52     }
53 iliev 1832
54     if(atomic_read(&(pAqData->pDevice->restartQueue))) return;
55    
56 iliev 1829 uint bufferSize = pAqData->pDevice->uiBufferSize;
57    
58     // let all connected engines render 'fragmentSize' sample points
59     pAqData->pDevice->RenderAudio(bufferSize);
60    
61 iliev 1884 Float32* pDataBuf = (Float32*)(inBuffer->mAudioData);
62 iliev 1829
63     uint uiCoreAudioChannels = pAqData->pDevice->uiCoreAudioChannels;
64     for (int c = 0; c < uiCoreAudioChannels; c++) {
65     float* in = pAqData->pDevice->Channels[c]->Buffer();
66     for (int i = 0, o = c; i < bufferSize; i++ , o += uiCoreAudioChannels) {
67 iliev 1884 pDataBuf[o] = in[i];
68 iliev 1829 }
69     }
70    
71 iliev 1884 inBuffer->mAudioDataByteSize = (uiCoreAudioChannels * 4) * bufferSize;
72 iliev 1829
73     OSStatus res = AudioQueueEnqueueBuffer(pAqData->mQueue, inBuffer, 0, NULL);
74     if(res) std::cerr << "AudioQueueEnqueueBuffer: Error " << res << std::endl;
75     }
76    
77 iliev 1832 void AudioOutputDeviceCoreAudio::DeviceChanged() {
78     dmsg(1,("Restarting audio queue..."));
79     atomic_set(&restartQueue, 1);
80 iliev 1829 }
81    
82     AudioOutputDeviceCoreAudio::AudioOutputDeviceCoreAudio (
83     std::map<String,DeviceCreationParameter*> Parameters
84 iliev 1832 ) : AudioOutputDevice(Parameters), Thread(true, true, 1, 0), CurrentDevice(0) {
85 iliev 1829
86     dmsg(2,("AudioOutputDeviceCoreAudio::AudioOutputDeviceCoreAudio()\n"));
87 iliev 1832 if(CAAudioDeviceListModel::GetModel()->GetOutputDeviceCount() < 1) {
88     throw Exception("No audio output device found");
89     }
90 iliev 1829 atomic_set(&pausedNew, 0);
91     pausedOld = 0;
92 iliev 1832 atomic_set(&restartQueue, 0);
93 iliev 1829
94     uiCoreAudioChannels = ((DeviceCreationParameterInt*)Parameters["CHANNELS"])->ValueAsInt();
95     uint samplerate = ((DeviceCreationParameterInt*)Parameters["SAMPLERATE"])->ValueAsInt();
96 iliev 1832 uiBufferNumber = ((DeviceCreationParameterInt*)Parameters["BUFFERS"])->ValueAsInt();
97 iliev 1829 uiBufferSize = ((DeviceCreationParameterInt*)Parameters["BUFFERSIZE"])->ValueAsInt();
98 iliev 1832 int device = 0;
99     try { device = ((ParameterDevice*)Parameters["DEVICE"])->GetDeviceIndex(); }
100     catch(Exception x) { }
101 iliev 1829
102 iliev 1832 CurrentDevice = CAAudioDeviceListModel::GetModel()->GetOutputDevice(device);
103     CurrentDevice.AddListener(this);
104    
105 iliev 1884 memset (&aqPlayerState.mDataFormat, 0, sizeof(AudioStreamBasicDescription));
106    
107 iliev 1829 aqPlayerState.mDataFormat.mSampleRate = samplerate;
108     aqPlayerState.mDataFormat.mFormatID = kAudioFormatLinearPCM;
109    
110     aqPlayerState.mDataFormat.mFormatFlags =
111 iliev 1884 kLinearPCMFormatFlagIsFloat | kLinearPCMFormatFlagIsPacked;
112 iliev 1829
113 iliev 1884 int samplesize = 4;
114     aqPlayerState.mDataFormat.mBytesPerPacket = uiCoreAudioChannels * samplesize;
115 iliev 1829 aqPlayerState.mDataFormat.mFramesPerPacket = 1;
116 iliev 1884 aqPlayerState.mDataFormat.mBytesPerFrame = uiCoreAudioChannels * samplesize;
117 iliev 1829 aqPlayerState.mDataFormat.mChannelsPerFrame = uiCoreAudioChannels;
118 iliev 1884 aqPlayerState.mDataFormat.mBitsPerChannel = 8 * samplesize;
119     aqPlayerState.mDataFormat.mReserved = 0;
120 iliev 1829
121     aqPlayerState.mBuffers = new AudioQueueBufferRef[uiBufferNumber];
122    
123     aqPlayerState.bufferByteSize =
124     MaxSamplesPerCycle() * aqPlayerState.mDataFormat.mBytesPerFrame;
125    
126     aqPlayerState.mNumPacketsToRead = MaxSamplesPerCycle();
127    
128     aqPlayerState.pDevice = this;
129     aqPlayerState.mQueue = NULL;
130    
131     uint fragmentSize = MaxSamplesPerCycle();
132     // create audio channels for this audio device to which the sampler engines can write to
133     for (int i = 0; i < uiCoreAudioChannels; i++) {
134     this->Channels.push_back(new AudioChannel(i, fragmentSize));
135     }
136    
137     StartThread();
138    
139     if (!((DeviceCreationParameterBool*)Parameters["ACTIVE"])->ValueAsBool()) {
140     Stop();
141     }
142     }
143    
144 persson 2183 AudioOutputDeviceCoreAudio::~AudioOutputDeviceCoreAudio() {
145 iliev 1829 atomic_set(&(aqPlayerState.mIsRunning), 0);
146 persson 2427 {
147     LockGuard lock(destroyMutex);
148     AudioQueueDispose(aqPlayerState.mQueue, true);
149     }
150 iliev 1829 delete [] aqPlayerState.mBuffers;
151 iliev 1832
152     CurrentDevice.RemoveListener(this);
153 iliev 1829 }
154    
155     String AudioOutputDeviceCoreAudio::Name() {
156     return "COREAUDIO";
157     }
158    
159     String AudioOutputDeviceCoreAudio::Description() {
160     return "Apple CoreAudio";
161     }
162    
163     String AudioOutputDeviceCoreAudio::Version() {
164 iliev 1884 String s = "$Revision: 1.5 $";
165 iliev 1829 return s.substr(11, s.size() - 13); // cut dollar signs, spaces and CVS macro keyword
166     }
167    
168     void AudioOutputDeviceCoreAudio::Play() {
169     atomic_set(&pausedNew, 0);
170     }
171    
172     bool AudioOutputDeviceCoreAudio::IsPlaying() {
173     return !atomic_read(&pausedNew);
174     }
175    
176     void AudioOutputDeviceCoreAudio::Stop() {
177     atomic_set(&pausedNew, 1);
178     }
179    
180     uint AudioOutputDeviceCoreAudio::MaxSamplesPerCycle() {
181     return uiBufferSize;
182     }
183    
184     uint AudioOutputDeviceCoreAudio::SampleRate() {
185     return aqPlayerState.mDataFormat.mSampleRate;
186     }
187    
188     String AudioOutputDeviceCoreAudio::Driver() {
189     return Name();
190     }
191    
192     AudioChannel* AudioOutputDeviceCoreAudio::CreateChannel(uint ChannelNr) {
193     // just create a mix channel
194     return new AudioChannel(ChannelNr, Channel(ChannelNr % uiCoreAudioChannels));
195     }
196    
197 iliev 1832 void AudioOutputDeviceCoreAudio::FillBuffers() {
198     for (int i = 0; i < uiBufferNumber; ++i) {
199     HandleOutputBuffer (
200 iliev 1829 &aqPlayerState,
201 iliev 1832 aqPlayerState.mQueue,
202     aqPlayerState.mBuffers[i]
203 iliev 1829 );
204 iliev 1832 }
205     }
206 iliev 1829
207 iliev 1832 void AudioOutputDeviceCoreAudio::PrimeAudioQueue() {
208     OSStatus res = AudioQueuePrime(aqPlayerState.mQueue, 0, NULL);
209     if(res) {
210     String s = String("AudioQueuePrime: Error ") + ToString(res);
211     throw Exception(s);
212     }
213     }
214 iliev 1829
215 iliev 1884 void AudioOutputDeviceCoreAudio::CreateAndStartAudioQueue() throw(Exception) {
216 iliev 1832 OSStatus res = AudioQueueNewOutput (
217     &aqPlayerState.mDataFormat,
218     HandleOutputBuffer,
219     &aqPlayerState,
220     CFRunLoopGetCurrent(),
221     kCFRunLoopCommonModes,
222     0,
223     &aqPlayerState.mQueue
224     );
225 iliev 1829
226 iliev 1832 if(res) {
227     String s = String("AudioQueueNewOutput: Error ") + ToString(res);
228     throw Exception(s);
229 iliev 1829 }
230    
231 iliev 1832 CFStringRef devUID = CFStringCreateWithCString (
232     NULL, CurrentDevice.GetUID().c_str(), kCFStringEncodingASCII
233     );
234     res = AudioQueueSetProperty (
235     aqPlayerState.mQueue,
236     kAudioQueueProperty_CurrentDevice,
237     &devUID, sizeof(CFStringRef)
238     );
239     CFRelease(devUID);
240    
241     if(res) {
242     String s = String("Failed to set audio device: ") + ToString(res);
243     throw Exception(s);
244     }
245    
246 iliev 1829 for (int i = 0; i < uiBufferNumber; ++i) {
247 iliev 1832 res = AudioQueueAllocateBuffer (
248 iliev 1829 aqPlayerState.mQueue,
249 iliev 1832 aqPlayerState.bufferByteSize,
250     &aqPlayerState.mBuffers[i]
251 iliev 1829 );
252 iliev 1832
253     if(res) {
254     String s = String("AudioQueueAllocateBuffer: Error ");
255     throw Exception(s + ToString(res));
256     }
257 iliev 1829 }
258    
259 iliev 1832 res = AudioQueueAddPropertyListener (
260     aqPlayerState.mQueue,
261     kAudioQueueProperty_CurrentDevice,
262     AudioQueueListener,
263     NULL
264     );
265     if(res) std::cerr << "Failed to register device change listener: " << res << std::endl;
266    
267     res = AudioQueueAddPropertyListener (
268     aqPlayerState.mQueue,
269     kAudioQueueProperty_IsRunning,
270     AudioQueueListener,
271     NULL
272     );
273     if(res) std::cerr << "Failed to register running listener: " << res << std::endl;
274    
275 iliev 1829 Float32 gain = 1.0;
276    
277 iliev 1832 res = AudioQueueSetParameter (
278 iliev 1829 aqPlayerState.mQueue,
279     kAudioQueueParam_Volume,
280     gain
281     );
282    
283     if(res) std::cerr << "AudioQueueSetParameter: Error " << res << std::endl;
284    
285     atomic_set(&(aqPlayerState.mIsRunning), 1);
286 iliev 1832 FillBuffers();
287     PrimeAudioQueue();
288 iliev 1829
289     res = AudioQueueStart(aqPlayerState.mQueue, NULL);
290     if(res) {
291     String s = String("AudioQueueStart: Error ") + ToString(res);
292     throw Exception(s);
293     }
294 iliev 1832 }
295 iliev 1829
296 iliev 1832 void AudioOutputDeviceCoreAudio::DestroyAudioQueue() {
297     AudioQueueFlush(aqPlayerState.mQueue);
298     AudioQueueStop (aqPlayerState.mQueue, true);
299     AudioQueueDispose(aqPlayerState.mQueue, true);
300     aqPlayerState.mQueue = NULL;
301     }
302    
303     /**
304     * Entry point for the thread.
305     */
306     int AudioOutputDeviceCoreAudio::Main() {
307 iliev 1835 dmsg(1,("CoreAudio thread started\n"));
308 iliev 1832 OSStatus res;
309     if(aqPlayerState.mQueue == NULL) {
310     /*
311     * Need to be run from this thread because of CFRunLoopGetCurrent()
312     * which returns the CFRunLoop object for the current thread.
313     */
314 iliev 1884 try { CreateAndStartAudioQueue(); }
315     catch(Exception e) {
316     std::cerr << "Failed to star audio queue: " + e.Message() << std::endl;
317     return 0;
318     }
319 iliev 1832 }
320    
321 persson 2427 {
322     LockGuard lock(destroyMutex);
323     do {
324     if(atomic_read(&pausedNew) != pausedOld) {
325     pausedOld = atomic_read(&pausedNew);
326 iliev 1829
327 persson 2427 if(pausedOld) {
328     res = AudioQueuePause(aqPlayerState.mQueue);
329     if(res) std::cerr << "AudioQueuePause: Error " << res << std::endl;
330     } else {
331     res = AudioQueuePrime(aqPlayerState.mQueue, 0, NULL);
332     if(res) std::cerr << "AudioQueuePrime: Error " << res << std::endl;
333     res = AudioQueueStart(aqPlayerState.mQueue, NULL);
334     if(res) std::cerr << "AudioQueueStart: Error " << res << std::endl;
335     }
336 iliev 1829 }
337 iliev 1832
338 persson 2427 if(atomic_read(&restartQueue)) {
339     DestroyAudioQueue();
340     CreateAndStartAudioQueue();
341     atomic_set(&restartQueue, 0);
342     dmsg(1,("Audio queue restarted"));
343 iliev 1832 }
344 iliev 1829
345 persson 2427 CFRunLoopRunInMode(kCFRunLoopDefaultMode, 0.2, false);
346     } while (atomic_read(&(aqPlayerState.mIsRunning)));
347     }
348 iliev 1829
349     dmsg(2,("CoreAudio thread stopped\n"));
350    
351 iliev 1846 pthread_exit(NULL);
352 iliev 1829 return 0;
353     }
354    
355    
356 iliev 1832 // *************** ParameterDevice ***************
357     // *
358    
359     AudioOutputDeviceCoreAudio::ParameterDevice::ParameterDevice() : DeviceCreationParameterString() {
360     InitWithDefault(); // use default device
361     }
362    
363     AudioOutputDeviceCoreAudio::ParameterDevice::ParameterDevice(String s)
364     throw (Exception) : DeviceCreationParameterString(s) {
365     }
366    
367     String AudioOutputDeviceCoreAudio::ParameterDevice::Description() {
368     return "Output device to be used";
369     }
370    
371     bool AudioOutputDeviceCoreAudio::ParameterDevice::Fix() {
372     return true;
373     }
374    
375     bool AudioOutputDeviceCoreAudio::ParameterDevice::Mandatory() {
376     return false;
377     }
378    
379     std::map<String,DeviceCreationParameter*>
380     AudioOutputDeviceCoreAudio::ParameterDevice::DependsAsParameters() {
381     return std::map<String,DeviceCreationParameter*>(); // no dependencies
382     }
383    
384     optional<String>
385     AudioOutputDeviceCoreAudio::ParameterDevice::DefaultAsString(std::map<String,String> Parameters) {
386     CAAudioDeviceListModel* devs = CAAudioDeviceListModel::GetModel();
387     if (devs->GetOutputDeviceCount() < 1) {
388     throw Exception("AudioOutputDeviceCoreAudio: Can't find any output device");
389     }
390     UInt32 idx = devs->GetOutputDeviceIndex(devs->GetDefaultOutputDeviceID());
391     return CreateDeviceName(idx);
392     }
393    
394     std::vector<String>
395     AudioOutputDeviceCoreAudio::ParameterDevice::PossibilitiesAsString(std::map<String,String> Parameters) {
396     std::vector<String> deviceNames;
397    
398     CAAudioDeviceListModel* devs = CAAudioDeviceListModel::GetModel();
399     for(int i = 0; i < devs->GetOutputDeviceCount(); i++) {
400     if(devs->GetOutputDevice(i).GetChannelNumber() < 1) continue;
401    
402     deviceNames.push_back(CreateDeviceName(i));
403     }
404    
405     return deviceNames;
406     }
407    
408     String AudioOutputDeviceCoreAudio::ParameterDevice::CreateDeviceName(int devIndex) {
409     CAAudioDeviceListModel* devs = CAAudioDeviceListModel::GetModel();
410     // Note that the space " " is used as delimiter to obtain the
411     // device index. See GetDeviceIndex()
412     return ToString(devIndex + 1) + " " + devs->GetOutputDevice(devIndex).GetName();
413     }
414    
415     void AudioOutputDeviceCoreAudio::ParameterDevice::OnSetValue(String s) throw (Exception) {
416     // not posssible, as parameter is fix
417     }
418    
419     String AudioOutputDeviceCoreAudio::ParameterDevice::Name() {
420     return "DEVICE";
421     }
422    
423     int AudioOutputDeviceCoreAudio::ParameterDevice::GetDeviceIndex() {
424     String s = ValueAsString();
425     if(s.empty()) return -1;
426     int n = s.find(' ');
427     s = s.substr(0, n);
428     return ToInt(s) - 1;
429     }
430    
431 iliev 1829 // *************** ParameterSampleRate ***************
432     // *
433    
434     AudioOutputDeviceCoreAudio::ParameterSampleRate::ParameterSampleRate() :
435     AudioOutputDevice::ParameterSampleRate::ParameterSampleRate() {
436    
437     }
438    
439     AudioOutputDeviceCoreAudio::ParameterSampleRate::ParameterSampleRate(String s) :
440     AudioOutputDevice::ParameterSampleRate::ParameterSampleRate(s) {
441    
442     }
443    
444 iliev 1832 std::map<String,DeviceCreationParameter*>
445     AudioOutputDeviceCoreAudio::ParameterSampleRate::DependsAsParameters() {
446     static ParameterDevice device;
447     std::map<String,DeviceCreationParameter*> dependencies;
448     dependencies[device.Name()] = &device;
449     return dependencies;
450     }
451    
452 iliev 1829 optional<int>
453     AudioOutputDeviceCoreAudio::ParameterSampleRate::DefaultAsInt(std::map<String,String> Parameters) {
454     dmsg(2,("AudioOutputDeviceCoreAudio::ParameterSampleRate::DefaultAsInt()\n"));
455 iliev 1832 ParameterDevice dev(Parameters["DEVICE"]);
456     int samplerate = 44100;
457    
458     try {
459     int idx = dev.GetDeviceIndex();
460    
461     CAAudioDeviceListModel* devs = CAAudioDeviceListModel::GetModel();
462     samplerate = devs->GetOutputDevice(idx).GetDefaultSamplerate();
463     } catch(Exception e) { }
464    
465     return samplerate;
466 iliev 1829 }
467    
468 iliev 1832 std::vector<int>
469     AudioOutputDeviceCoreAudio::ParameterSampleRate::PossibilitiesAsInt(std::map<String,String> Parameters) {
470     ParameterDevice dev(Parameters["DEVICE"]);
471     std::vector<int> srates;
472 iliev 1829
473 iliev 1832 try {
474     int idx = dev.GetDeviceIndex();
475     CAAudioDeviceListModel* devs = CAAudioDeviceListModel::GetModel();
476     srates = devs->GetOutputDevice(idx).GetNominalSamplerates();
477     } catch(Exception x) { }
478    
479     return srates;
480     }
481    
482    
483 iliev 1829 // *************** ParameterChannels ***************
484     // *
485    
486     AudioOutputDeviceCoreAudio::ParameterChannels::ParameterChannels() :
487     AudioOutputDevice::ParameterChannels::ParameterChannels() {
488    
489     }
490    
491     AudioOutputDeviceCoreAudio::ParameterChannels::ParameterChannels(String s) :
492     AudioOutputDevice::ParameterChannels::ParameterChannels(s) {
493    
494     }
495    
496     optional<int>
497     AudioOutputDeviceCoreAudio::ParameterChannels::DefaultAsInt(std::map<String,String> Parameters) {
498     dmsg(2,("AudioOutputDeviceCoreAudio::ParameterChannels::DefaultAsInt()\n"));
499 iliev 1832 ParameterDevice dev(Parameters["DEVICE"]);
500     int chns = 2;
501    
502     try {
503     int idx = dev.GetDeviceIndex();
504     CAAudioDeviceListModel* devs = CAAudioDeviceListModel::GetModel();
505     chns = devs->GetOutputDevice(idx).GetChannelNumber();
506     } catch(Exception e) { }
507    
508     return chns;
509 iliev 1829 }
510    
511 iliev 1832 std::vector<int>
512     AudioOutputDeviceCoreAudio::ParameterChannels::PossibilitiesAsInt(std::map<String,String> Parameters) {
513     ParameterDevice dev(Parameters["DEVICE"]);
514     std::vector<int> chns;
515    
516     try {
517     int idx = dev.GetDeviceIndex();
518     CAAudioDeviceListModel* devs = CAAudioDeviceListModel::GetModel();
519     for(int i = 1; i <= devs->GetOutputDevice(idx).GetChannelNumber(); i++) {
520     chns.push_back(i);
521     }
522     } catch(Exception x) { }
523    
524     return chns;
525     }
526    
527 iliev 1829 // *************** ParameterBuffers ***************
528     // *
529    
530     AudioOutputDeviceCoreAudio::ParameterBuffers::ParameterBuffers() : DeviceCreationParameterInt() {
531     InitWithDefault();
532     }
533    
534     AudioOutputDeviceCoreAudio::ParameterBuffers::ParameterBuffers(String s)
535     throw (Exception) : DeviceCreationParameterInt(s) {
536     }
537    
538     String AudioOutputDeviceCoreAudio::ParameterBuffers::Description() {
539     return "Number of audio buffer";
540     }
541    
542     bool AudioOutputDeviceCoreAudio::ParameterBuffers::Fix() {
543     return true;
544     }
545    
546     bool AudioOutputDeviceCoreAudio::ParameterBuffers::Mandatory() {
547     return false;
548     }
549    
550     std::map<String,DeviceCreationParameter*>
551     AudioOutputDeviceCoreAudio::ParameterBuffers::DependsAsParameters() {
552     return std::map<String,DeviceCreationParameter*>();
553     }
554    
555     optional<int>
556     AudioOutputDeviceCoreAudio::ParameterBuffers::DefaultAsInt(std::map<String,String> Parameters) {
557     return 3;
558     }
559    
560     optional<int>
561     AudioOutputDeviceCoreAudio::ParameterBuffers::RangeMinAsInt(std::map<String,String> Parameters) {
562     return 2;
563     }
564    
565     optional<int>
566     AudioOutputDeviceCoreAudio::ParameterBuffers::RangeMaxAsInt(std::map<String,String> Parameters) {
567     return 16;
568     }
569    
570     std::vector<int>
571     AudioOutputDeviceCoreAudio::ParameterBuffers::PossibilitiesAsInt(std::map<String,String> Parameters) {
572     return std::vector<int>();
573     }
574    
575     void AudioOutputDeviceCoreAudio::ParameterBuffers::OnSetValue(int i) throw (Exception) {
576     // not posssible, as parameter is fix
577     }
578    
579     String AudioOutputDeviceCoreAudio::ParameterBuffers::Name() {
580     return "BUFFERS";
581     }
582    
583     // *************** ParameterBufferSize ***************
584     // *
585    
586     AudioOutputDeviceCoreAudio::ParameterBufferSize::ParameterBufferSize() : DeviceCreationParameterInt() {
587     InitWithDefault();
588     }
589    
590     AudioOutputDeviceCoreAudio::ParameterBufferSize::ParameterBufferSize(String s)
591     throw (Exception) : DeviceCreationParameterInt(s) {
592     }
593    
594     String AudioOutputDeviceCoreAudio::ParameterBufferSize::Description() {
595     return "Size of the audio buffer in sample frames";
596     }
597    
598     bool AudioOutputDeviceCoreAudio::ParameterBufferSize::Fix() {
599     return true;
600     }
601    
602     bool AudioOutputDeviceCoreAudio::ParameterBufferSize::Mandatory() {
603     return false;
604     }
605    
606     std::map<String,DeviceCreationParameter*>
607     AudioOutputDeviceCoreAudio::ParameterBufferSize::DependsAsParameters() {
608     return std::map<String,DeviceCreationParameter*>();
609     }
610    
611     optional<int>
612     AudioOutputDeviceCoreAudio::ParameterBufferSize::DefaultAsInt(std::map<String,String> Parameters) {
613 iliev 1884 return 256;
614 iliev 1829 }
615    
616     optional<int>
617     AudioOutputDeviceCoreAudio::ParameterBufferSize::RangeMinAsInt(std::map<String,String> Parameters) {
618     return 32;
619     }
620    
621     optional<int>
622     AudioOutputDeviceCoreAudio::ParameterBufferSize::RangeMaxAsInt(std::map<String,String> Parameters) {
623     return 4096;
624     }
625    
626     std::vector<int>
627     AudioOutputDeviceCoreAudio::ParameterBufferSize::PossibilitiesAsInt(std::map<String,String> Parameters) {
628     return std::vector<int>();
629     }
630    
631     void AudioOutputDeviceCoreAudio::ParameterBufferSize::OnSetValue(int i) throw (Exception) {
632     // not posssible, as parameter is fix
633     }
634    
635     String AudioOutputDeviceCoreAudio::ParameterBufferSize::Name() {
636     return "BUFFERSIZE";
637     }
638     } // namespace LinuxSampler

  ViewVC Help
Powered by ViewVC