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

Diff of /linuxsampler/trunk/src/drivers/audio/AudioOutputDeviceAlsa.cpp

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 212 by schoenebeck, Wed Jul 28 14:17:29 2004 UTC revision 227 by schoenebeck, Thu Aug 26 22:05:44 2004 UTC
# Line 47  namespace LinuxSampler { Line 47  namespace LinuxSampler {
47      }      }
48    
49      AudioOutputDeviceAlsa::ParameterCard::ParameterCard(String s) throw (LinuxSamplerException) : DeviceCreationParameterString(s) {      AudioOutputDeviceAlsa::ParameterCard::ParameterCard(String s) throw (LinuxSamplerException) : DeviceCreationParameterString(s) {
         SetValue(s); // try to use given card  
50      }      }
51    
52      String AudioOutputDeviceAlsa::ParameterCard::Description() {      String AudioOutputDeviceAlsa::ParameterCard::Description() {
# Line 105  namespace LinuxSampler { Line 104  namespace LinuxSampler {
104      }      }
105    
106      String AudioOutputDeviceAlsa::ParameterCard::Name() {      String AudioOutputDeviceAlsa::ParameterCard::Name() {
107          return "card";          return "CARD";
108      }      }
109    
110    
# Line 144  namespace LinuxSampler { Line 143  namespace LinuxSampler {
143      }      }
144    
145      optional<int> AudioOutputDeviceAlsa::ParameterFragments::RangeMinAsInt(std::map<String,String> Parameters) {      optional<int> AudioOutputDeviceAlsa::ParameterFragments::RangeMinAsInt(std::map<String,String> Parameters) {
146          return optional<int>::nothing;          if (!Parameters.count("CARD")) return optional<int>::nothing;
147    
148            // obtain information from given sound card
149            String pcm_name       = "hw:" + Parameters["CARD"];
150            snd_pcm_t* pcm_handle = NULL;
151            if (snd_pcm_open(&pcm_handle, pcm_name.c_str(), SND_PCM_STREAM_PLAYBACK, 0) < 0) return optional<int>::nothing;
152            snd_pcm_hw_params_t* hwparams;
153            snd_pcm_hw_params_alloca(&hwparams);
154            if (snd_pcm_hw_params_any(pcm_handle, hwparams) < 0) {
155                snd_pcm_close(pcm_handle);
156                return optional<int>::nothing;
157            }
158            int dir = 0;
159            uint periods_min;
160            if (snd_pcm_hw_params_get_periods_min(hwparams, &periods_min, &dir) < 0) {
161                snd_pcm_close(pcm_handle);
162                return optional<int>::nothing;
163            }
164            snd_pcm_close(pcm_handle);
165            return (int) periods_min;
166      }      }
167    
168      optional<int> AudioOutputDeviceAlsa::ParameterFragments::RangeMaxAsInt(std::map<String,String> Parameters) {      optional<int> AudioOutputDeviceAlsa::ParameterFragments::RangeMaxAsInt(std::map<String,String> Parameters) {
169          return optional<int>::nothing;          if (!Parameters.count("CARD")) return optional<int>::nothing;
170    
171            // obtain information from given sound card
172            String pcm_name       = "hw:" + Parameters["CARD"];
173            snd_pcm_t* pcm_handle = NULL;
174            if (snd_pcm_open(&pcm_handle, pcm_name.c_str(), SND_PCM_STREAM_PLAYBACK, 0) < 0) return optional<int>::nothing;
175            snd_pcm_hw_params_t* hwparams;
176            snd_pcm_hw_params_alloca(&hwparams);
177            if (snd_pcm_hw_params_any(pcm_handle, hwparams) < 0) {
178                snd_pcm_close(pcm_handle);
179                return optional<int>::nothing;
180            }
181            int dir = 0;
182            uint periods_max;
183            if (snd_pcm_hw_params_get_periods_max(hwparams, &periods_max, &dir) < 0) {
184                snd_pcm_close(pcm_handle);
185                return optional<int>::nothing;
186            }
187            snd_pcm_close(pcm_handle);
188            return (int) periods_max;
189      }      }
190    
191      std::vector<int> AudioOutputDeviceAlsa::ParameterFragments::PossibilitiesAsInt(std::map<String,String> Parameters) {      std::vector<int> AudioOutputDeviceAlsa::ParameterFragments::PossibilitiesAsInt(std::map<String,String> Parameters) {
# Line 160  namespace LinuxSampler { Line 197  namespace LinuxSampler {
197      }      }
198    
199      String AudioOutputDeviceAlsa::ParameterFragments::Name() {      String AudioOutputDeviceAlsa::ParameterFragments::Name() {
200          return "fragments";          return "FRAGMENTS";
201      }      }
202    
203    
# Line 199  namespace LinuxSampler { Line 236  namespace LinuxSampler {
236      }      }
237    
238      optional<int> AudioOutputDeviceAlsa::ParameterFragmentSize::RangeMinAsInt(std::map<String,String> Parameters) {      optional<int> AudioOutputDeviceAlsa::ParameterFragmentSize::RangeMinAsInt(std::map<String,String> Parameters) {
239          return optional<int>::nothing;          if (!Parameters.count("CARD")) return optional<int>::nothing;
240    
241            // obtain information from given sound card
242            String pcm_name       = "hw:" + Parameters["CARD"];
243            snd_pcm_t* pcm_handle = NULL;
244            if (snd_pcm_open(&pcm_handle, pcm_name.c_str(), SND_PCM_STREAM_PLAYBACK, 0) < 0) return optional<int>::nothing;
245            snd_pcm_hw_params_t* hwparams;
246            snd_pcm_hw_params_alloca(&hwparams);
247            if (snd_pcm_hw_params_any(pcm_handle, hwparams) < 0) {
248                snd_pcm_close(pcm_handle);
249                return optional<int>::nothing;
250            }
251            int dir = 0;
252            unsigned long period_size_min;
253            if (snd_pcm_hw_params_get_period_size_min(hwparams, &period_size_min, &dir) < 0) {
254                snd_pcm_close(pcm_handle);
255                return optional<int>::nothing;
256            }
257            snd_pcm_close(pcm_handle);
258            return (int) period_size_min;
259      }      }
260    
261      optional<int> AudioOutputDeviceAlsa::ParameterFragmentSize::RangeMaxAsInt(std::map<String,String> Parameters) {      optional<int> AudioOutputDeviceAlsa::ParameterFragmentSize::RangeMaxAsInt(std::map<String,String> Parameters) {
262          return optional<int>::nothing;          if (!Parameters.count("CARD")) return optional<int>::nothing;
263    
264            // obtain information from given sound card
265            String pcm_name       = "hw:" + Parameters["CARD"];
266            snd_pcm_t* pcm_handle = NULL;
267            if (snd_pcm_open(&pcm_handle, pcm_name.c_str(), SND_PCM_STREAM_PLAYBACK, 0) < 0) return optional<int>::nothing;
268            snd_pcm_hw_params_t* hwparams;
269            snd_pcm_hw_params_alloca(&hwparams);
270            if (snd_pcm_hw_params_any(pcm_handle, hwparams) < 0) {
271                snd_pcm_close(pcm_handle);
272                return optional<int>::nothing;
273            }
274            int dir = 0;
275            unsigned long period_size_max;
276            if (snd_pcm_hw_params_get_period_size_max(hwparams, &period_size_max, &dir) < 0) {
277                snd_pcm_close(pcm_handle);
278                return optional<int>::nothing;
279            }
280            snd_pcm_close(pcm_handle);
281            return (int) period_size_max; //FIXME: might overflow int limit
282      }      }
283    
284      std::vector<int> AudioOutputDeviceAlsa::ParameterFragmentSize::PossibilitiesAsInt(std::map<String,String> Parameters) {      std::vector<int> AudioOutputDeviceAlsa::ParameterFragmentSize::PossibilitiesAsInt(std::map<String,String> Parameters) {
# Line 215  namespace LinuxSampler { Line 290  namespace LinuxSampler {
290      }      }
291    
292      String AudioOutputDeviceAlsa::ParameterFragmentSize::Name() {      String AudioOutputDeviceAlsa::ParameterFragmentSize::Name() {
293          return "fragmentsize";          return "FRAGMENTSIZE";
294      }      }
295    
296    
# Line 232  namespace LinuxSampler { Line 307  namespace LinuxSampler {
307      AudioOutputDeviceAlsa::AudioOutputDeviceAlsa(std::map<String,DeviceCreationParameter*> Parameters) : AudioOutputDevice(Parameters), Thread(true, 1, 0) {      AudioOutputDeviceAlsa::AudioOutputDeviceAlsa(std::map<String,DeviceCreationParameter*> Parameters) : AudioOutputDevice(Parameters), Thread(true, 1, 0) {
308          pcm_handle           = NULL;          pcm_handle           = NULL;
309          stream               = SND_PCM_STREAM_PLAYBACK;          stream               = SND_PCM_STREAM_PLAYBACK;
310          this->uiAlsaChannels = ((DeviceCreationParameterInt*)Parameters["channels"])->ValueAsInt();          this->uiAlsaChannels = ((DeviceCreationParameterInt*)Parameters["CHANNELS"])->ValueAsInt();
311          this->uiSamplerate   = ((DeviceCreationParameterInt*)Parameters["samplerate"])->ValueAsInt();          this->uiSamplerate   = ((DeviceCreationParameterInt*)Parameters["SAMPLERATE"])->ValueAsInt();
312          this->FragmentSize   = ((DeviceCreationParameterInt*)Parameters["fragmentsize"])->ValueAsInt();          this->FragmentSize   = ((DeviceCreationParameterInt*)Parameters["FRAGMENTSIZE"])->ValueAsInt();
313          uint Fragments       = ((DeviceCreationParameterInt*)Parameters["fragments"])->ValueAsInt();          uint Fragments       = ((DeviceCreationParameterInt*)Parameters["FRAGMENTS"])->ValueAsInt();
314          String Card          = Parameters["card"]->Value();          String Card          = ((DeviceCreationParameterString*)Parameters["CARD"])->ValueAsString();
315    
316          dmsg(1,("Checking if hw parameters supported...\n"));          dmsg(1,("Checking if hw parameters supported...\n"));
317          if (HardwareParametersSupported(Card, uiAlsaChannels, uiSamplerate, Fragments, FragmentSize)) {          if (HardwareParametersSupported(Card, uiAlsaChannels, uiSamplerate, Fragments, FragmentSize)) {
# Line 344  namespace LinuxSampler { Line 419  namespace LinuxSampler {
419          pAlsaOutputBuffer = new int16_t[uiAlsaChannels * FragmentSize];          pAlsaOutputBuffer = new int16_t[uiAlsaChannels * FragmentSize];
420    
421          // create audio channels for this audio device to which the sampler engines can write to          // create audio channels for this audio device to which the sampler engines can write to
422          for (int i = 0; i < uiAlsaChannels; i++) this->Channels.push_back(new AudioChannel(FragmentSize));          for (int i = 0; i < uiAlsaChannels; i++) this->Channels.push_back(new AudioChannel(i, FragmentSize));
423    
424          if (((DeviceCreationParameterBool*)Parameters["active"])->ValueAsBool()) {          if (((DeviceCreationParameterBool*)Parameters["ACTIVE"])->ValueAsBool()) {
425                  Play();                  Play();
426          }          }
427      }      }
# Line 359  namespace LinuxSampler { Line 434  namespace LinuxSampler {
434          //FIXME: currently commented out due to segfault          //FIXME: currently commented out due to segfault
435          //snd_pcm_close(pcm_handle);          //snd_pcm_close(pcm_handle);
436    
         // destroy all audio channels  
         for (int c = 0; c < Channels.size(); c++) delete Channels[c];  
   
437          if (pAlsaOutputBuffer) {          if (pAlsaOutputBuffer) {
438              //FIXME: currently commented out due to segfault              //FIXME: currently commented out due to segfault
439              //delete[] pOutputBuffer;              //delete[] pOutputBuffer;
# Line 428  namespace LinuxSampler { Line 500  namespace LinuxSampler {
500          StopThread();          StopThread();
501      }      }
502    
503      void AudioOutputDeviceAlsa::AcquireChannels(uint Channels) {      AudioChannel* AudioOutputDeviceAlsa::CreateChannel(uint ChannelNr) {
504          if (Channels > uiAlsaChannels) {          // just create a mix channel
505              // just create mix channel(s)          return new AudioChannel(ChannelNr, Channel(ChannelNr % uiAlsaChannels));
             for (int i = uiAlsaChannels; i < Channels; i++) {  
                 AudioChannel* pNewChannel = new AudioChannel(this->Channels[i % uiAlsaChannels]);  
                 this->Channels.push_back(pNewChannel);  
             }  
         }  
506      }      }
507    
508      uint AudioOutputDeviceAlsa::MaxSamplesPerCycle() {      uint AudioOutputDeviceAlsa::MaxSamplesPerCycle() {
# Line 447  namespace LinuxSampler { Line 514  namespace LinuxSampler {
514      }      }
515    
516      String AudioOutputDeviceAlsa::Name() {      String AudioOutputDeviceAlsa::Name() {
517          return "Alsa";          return "ALSA";
518      }      }
519    
520      String AudioOutputDeviceAlsa::Driver() {      String AudioOutputDeviceAlsa::Driver() {
# Line 459  namespace LinuxSampler { Line 526  namespace LinuxSampler {
526      }      }
527    
528      String AudioOutputDeviceAlsa::Version() {      String AudioOutputDeviceAlsa::Version() {
529         String s = "$Revision: 1.11 $";         String s = "$Revision: 1.15 $";
530         return s.substr(11, s.size() - 13); // cut dollar signs, spaces and CVS macro keyword         return s.substr(11, s.size() - 13); // cut dollar signs, spaces and CVS macro keyword
531      }      }
532    
# Line 510  namespace LinuxSampler { Line 577  namespace LinuxSampler {
577      }      }
578    
579  } // namespace LinuxSampler  } // namespace LinuxSampler
   

Legend:
Removed from v.212  
changed lines
  Added in v.227

  ViewVC Help
Powered by ViewVC