svapp  1.9
AudioTargetFactory.cpp
Go to the documentation of this file.
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