annotate audioio/AudioTargetFactory.cpp @ 152:6f1e64670451

* Fix crash in SimpleSPARQLQuery * Fix failure to add images from local files
author Chris Cannam
date Thu, 15 Jan 2009 18:20:40 +0000
parents b774a451b093
children 67cea66bd588
rev   line source
Chris@43 1 /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
Chris@43 2
Chris@43 3 /*
Chris@43 4 Sonic Visualiser
Chris@43 5 An audio file viewer and annotation editor.
Chris@43 6 Centre for Digital Music, Queen Mary, University of London.
Chris@43 7 This file copyright 2006 Chris Cannam.
Chris@43 8
Chris@43 9 This program is free software; you can redistribute it and/or
Chris@43 10 modify it under the terms of the GNU General Public License as
Chris@43 11 published by the Free Software Foundation; either version 2 of the
Chris@43 12 License, or (at your option) any later version. See the file
Chris@43 13 COPYING included with this distribution for more information.
Chris@43 14 */
Chris@43 15
Chris@43 16 #include "AudioTargetFactory.h"
Chris@43 17
Chris@43 18 #include "AudioJACKTarget.h"
Chris@43 19 #include "AudioCoreAudioTarget.h"
Chris@43 20 #include "AudioPortAudioTarget.h"
Chris@117 21 #include "AudioPulseAudioTarget.h"
Chris@43 22
Chris@149 23 #include "AudioCallbackPlayTarget.h"
Chris@149 24
Chris@126 25 #include <QCoreApplication>
Chris@126 26
Chris@43 27 #include <iostream>
Chris@43 28
Chris@126 29 AudioTargetFactory *
Chris@126 30 AudioTargetFactory::m_instance = 0;
Chris@126 31
Chris@126 32 AudioTargetFactory *
Chris@126 33 AudioTargetFactory::getInstance()
Chris@126 34 {
Chris@126 35 if (!m_instance) m_instance = new AudioTargetFactory();
Chris@126 36 return m_instance;
Chris@126 37 }
Chris@126 38
Chris@126 39 AudioTargetFactory::AudioTargetFactory()
Chris@126 40 {
Chris@126 41 }
Chris@126 42
Chris@126 43 std::vector<QString>
Chris@126 44 AudioTargetFactory::getCallbackTargetNames(bool includeAuto) const
Chris@126 45 {
Chris@126 46 std::vector<QString> names;
Chris@126 47 if (includeAuto) names.push_back("auto");
Chris@126 48
Chris@126 49 #ifdef HAVE_JACK
Chris@126 50 names.push_back("jack");
Chris@126 51 #endif
Chris@126 52
Chris@126 53 #ifdef HAVE_LIBPULSE
Chris@126 54 names.push_back("pulse");
Chris@126 55 #endif
Chris@126 56
Chris@126 57 #ifdef HAVE_COREAUDIO
Chris@126 58 names.push_back("core");
Chris@126 59 #endif
Chris@126 60
Chris@126 61 #ifdef HAVE_PORTAUDIO_2_0
Chris@126 62 names.push_back("port");
Chris@126 63 #endif
Chris@126 64
Chris@126 65 return names;
Chris@126 66 }
Chris@126 67
Chris@126 68 QString
Chris@126 69 AudioTargetFactory::getCallbackTargetDescription(QString name) const
Chris@126 70 {
Chris@126 71 if (name == "auto") {
Chris@126 72 return QCoreApplication::translate("AudioTargetFactory",
Chris@126 73 "(auto)");
Chris@126 74 }
Chris@126 75 if (name == "jack") {
Chris@126 76 return QCoreApplication::translate("AudioTargetFactory",
Chris@126 77 "JACK Audio Connection Kit");
Chris@126 78 }
Chris@126 79 if (name == "pulse") {
Chris@126 80 return QCoreApplication::translate("AudioTargetFactory",
Chris@126 81 "PulseAudio Server");
Chris@126 82 }
Chris@126 83 if (name == "core") {
Chris@126 84 return QCoreApplication::translate("AudioTargetFactory",
Chris@126 85 "Core Audio Device");
Chris@126 86 }
Chris@126 87 if (name == "port") {
Chris@126 88 return QCoreApplication::translate("AudioTargetFactory",
Chris@126 89 "Default Soundcard Device");
Chris@126 90 }
Chris@126 91
Chris@126 92 return "(unknown)";
Chris@126 93 }
Chris@126 94
Chris@126 95 QString
Chris@126 96 AudioTargetFactory::getDefaultCallbackTarget() const
Chris@126 97 {
Chris@126 98 if (m_default == "") return "auto";
Chris@126 99 return m_default;
Chris@126 100 }
Chris@126 101
Chris@126 102 bool
Chris@126 103 AudioTargetFactory::isAutoCallbackTarget(QString name) const
Chris@126 104 {
Chris@126 105 return (name == "auto" || name == "");
Chris@126 106 }
Chris@126 107
Chris@126 108 void
Chris@126 109 AudioTargetFactory::setDefaultCallbackTarget(QString target)
Chris@126 110 {
Chris@126 111 m_default = target;
Chris@126 112 }
Chris@126 113
Chris@43 114 AudioCallbackPlayTarget *
Chris@43 115 AudioTargetFactory::createCallbackTarget(AudioCallbackPlaySource *source)
Chris@43 116 {
Chris@43 117 AudioCallbackPlayTarget *target = 0;
Chris@43 118
Chris@126 119 if (m_default != "" && m_default != "auto") {
Chris@126 120
Chris@126 121 #ifdef HAVE_JACK
Chris@126 122 if (m_default == "jack") target = new AudioJACKTarget(source);
Chris@126 123 #endif
Chris@126 124
Chris@126 125 #ifdef HAVE_LIBPULSE
Chris@126 126 if (m_default == "pulse") target = new AudioPulseAudioTarget(source);
Chris@126 127 #endif
Chris@126 128
Chris@126 129 #ifdef HAVE_COREAUDIO
Chris@126 130 if (m_default == "core") target = new AudioCoreAudioTarget(source);
Chris@126 131 #endif
Chris@126 132
Chris@126 133 #ifdef HAVE_PORTAUDIO_2_0
Chris@126 134 if (m_default == "port") target = new AudioPortAudioTarget(source);
Chris@126 135 #endif
Chris@126 136
Chris@126 137 if (!target || !target->isOK()) {
Chris@126 138 std::cerr << "WARNING: AudioTargetFactory::createCallbackTarget: Failed to open the requested target (\"" << m_default.toStdString() << "\")" << std::endl;
Chris@126 139 delete target;
Chris@126 140 return 0;
Chris@126 141 } else {
Chris@126 142 return target;
Chris@126 143 }
Chris@126 144 }
Chris@126 145
Chris@43 146 #ifdef HAVE_JACK
Chris@43 147 target = new AudioJACKTarget(source);
Chris@43 148 if (target->isOK()) return target;
Chris@43 149 else {
Chris@43 150 std::cerr << "WARNING: AudioTargetFactory::createCallbackTarget: Failed to open JACK target" << std::endl;
Chris@43 151 delete target;
Chris@43 152 }
Chris@43 153 #endif
Chris@117 154
Chris@117 155 #ifdef HAVE_LIBPULSE
Chris@117 156 target = new AudioPulseAudioTarget(source);
Chris@117 157 if (target->isOK()) return target;
Chris@117 158 else {
Chris@117 159 std::cerr << "WARNING: AudioTargetFactory::createCallbackTarget: Failed to open PulseAudio target" << std::endl;
Chris@117 160 delete target;
Chris@117 161 }
Chris@117 162 #endif
Chris@43 163
Chris@43 164 #ifdef HAVE_COREAUDIO
Chris@43 165 target = new AudioCoreAudioTarget(source);
Chris@43 166 if (target->isOK()) return target;
Chris@43 167 else {
Chris@43 168 std::cerr << "WARNING: AudioTargetFactory::createCallbackTarget: Failed to open CoreAudio target" << std::endl;
Chris@43 169 delete target;
Chris@43 170 }
Chris@43 171 #endif
Chris@114 172
Chris@114 173 #ifdef HAVE_PORTAUDIO_2_0
Chris@43 174 target = new AudioPortAudioTarget(source);
Chris@43 175 if (target->isOK()) return target;
Chris@43 176 else {
Chris@43 177 std::cerr << "WARNING: AudioTargetFactory::createCallbackTarget: Failed to open PortAudio target" << std::endl;
Chris@43 178 delete target;
Chris@43 179 }
Chris@43 180 #endif
Chris@43 181
Chris@43 182 std::cerr << "WARNING: AudioTargetFactory::createCallbackTarget: No suitable targets available" << std::endl;
Chris@43 183 return 0;
Chris@43 184 }
Chris@43 185
Chris@43 186