svapp
1.9
|
00001 /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ 00002 00003 /* 00004 Sonic Visualiser 00005 An audio file viewer and annotation editor. 00006 Centre for Digital Music, Queen Mary, University of London. 00007 This file copyright 2006 Chris Cannam. 00008 00009 This program is free software; you can redistribute it and/or 00010 modify it under the terms of the GNU General Public License as 00011 published by the Free Software Foundation; either version 2 of the 00012 License, or (at your option) any later version. See the file 00013 COPYING included with this distribution for more information. 00014 */ 00015 00016 #include "AudioTargetFactory.h" 00017 00018 #include "AudioJACKTarget.h" 00019 #include "AudioPortAudioTarget.h" 00020 #include "AudioPulseAudioTarget.h" 00021 00022 #include "AudioCallbackPlayTarget.h" 00023 00024 #include <QCoreApplication> 00025 00026 #include <iostream> 00027 00028 AudioTargetFactory * 00029 AudioTargetFactory::m_instance = 0; 00030 00031 AudioTargetFactory * 00032 AudioTargetFactory::getInstance() 00033 { 00034 if (!m_instance) m_instance = new AudioTargetFactory(); 00035 return m_instance; 00036 } 00037 00038 AudioTargetFactory::AudioTargetFactory() 00039 { 00040 } 00041 00042 std::vector<QString> 00043 AudioTargetFactory::getCallbackTargetNames(bool includeAuto) const 00044 { 00045 std::vector<QString> names; 00046 if (includeAuto) names.push_back("auto"); 00047 00048 #ifdef HAVE_JACK 00049 names.push_back("jack"); 00050 #endif 00051 00052 #ifdef HAVE_LIBPULSE 00053 names.push_back("pulse"); 00054 #endif 00055 00056 #ifdef HAVE_PORTAUDIO_2_0 00057 names.push_back("port"); 00058 #endif 00059 00060 return names; 00061 } 00062 00063 QString 00064 AudioTargetFactory::getCallbackTargetDescription(QString name) const 00065 { 00066 if (name == "auto") { 00067 return QCoreApplication::translate("AudioTargetFactory", 00068 "(auto)"); 00069 } 00070 if (name == "jack") { 00071 return QCoreApplication::translate("AudioTargetFactory", 00072 "JACK Audio Connection Kit"); 00073 } 00074 if (name == "pulse") { 00075 return QCoreApplication::translate("AudioTargetFactory", 00076 "PulseAudio Server"); 00077 } 00078 if (name == "port") { 00079 return QCoreApplication::translate("AudioTargetFactory", 00080 "Default Soundcard Device"); 00081 } 00082 00083 return "(unknown)"; 00084 } 00085 00086 QString 00087 AudioTargetFactory::getDefaultCallbackTarget() const 00088 { 00089 if (m_default == "") return "auto"; 00090 return m_default; 00091 } 00092 00093 bool 00094 AudioTargetFactory::isAutoCallbackTarget(QString name) const 00095 { 00096 return (name == "auto" || name == ""); 00097 } 00098 00099 void 00100 AudioTargetFactory::setDefaultCallbackTarget(QString target) 00101 { 00102 m_default = target; 00103 } 00104 00105 AudioCallbackPlayTarget * 00106 AudioTargetFactory::createCallbackTarget(AudioCallbackPlaySource *source) 00107 { 00108 AudioCallbackPlayTarget *target = 0; 00109 00110 if (m_default != "" && m_default != "auto") { 00111 00112 #ifdef HAVE_JACK 00113 if (m_default == "jack") target = new AudioJACKTarget(source); 00114 #endif 00115 00116 #ifdef HAVE_LIBPULSE 00117 if (m_default == "pulse") target = new AudioPulseAudioTarget(source); 00118 #endif 00119 00120 #ifdef HAVE_PORTAUDIO_2_0 00121 if (m_default == "port") target = new AudioPortAudioTarget(source); 00122 #endif 00123 00124 if (!target || !target->isOK()) { 00125 cerr << "WARNING: AudioTargetFactory::createCallbackTarget: Failed to open the requested target (\"" << m_default << "\")" << endl; 00126 delete target; 00127 return 0; 00128 } else { 00129 return target; 00130 } 00131 } 00132 00133 #ifdef HAVE_JACK 00134 target = new AudioJACKTarget(source); 00135 if (target->isOK()) return target; 00136 else { 00137 cerr << "WARNING: AudioTargetFactory::createCallbackTarget: Failed to open JACK target" << endl; 00138 delete target; 00139 } 00140 #endif 00141 00142 #ifdef HAVE_LIBPULSE 00143 target = new AudioPulseAudioTarget(source); 00144 if (target->isOK()) return target; 00145 else { 00146 cerr << "WARNING: AudioTargetFactory::createCallbackTarget: Failed to open PulseAudio target" << endl; 00147 delete target; 00148 } 00149 #endif 00150 00151 #ifdef HAVE_PORTAUDIO_2_0 00152 target = new AudioPortAudioTarget(source); 00153 if (target->isOK()) return target; 00154 else { 00155 cerr << "WARNING: AudioTargetFactory::createCallbackTarget: Failed to open PortAudio target" << endl; 00156 delete target; 00157 } 00158 #endif 00159 00160 cerr << "WARNING: AudioTargetFactory::createCallbackTarget: No suitable targets available" << endl; 00161 return 0; 00162 } 00163 00164