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 "AudioPortAudioTarget.h"
|
Chris@117
|
20 #include "AudioPulseAudioTarget.h"
|
Chris@43
|
21
|
Chris@149
|
22 #include "AudioCallbackPlayTarget.h"
|
Chris@149
|
23
|
Chris@126
|
24 #include <QCoreApplication>
|
Chris@126
|
25
|
Chris@43
|
26 #include <iostream>
|
Chris@43
|
27
|
Chris@126
|
28 AudioTargetFactory *
|
Chris@126
|
29 AudioTargetFactory::m_instance = 0;
|
Chris@126
|
30
|
Chris@126
|
31 AudioTargetFactory *
|
Chris@126
|
32 AudioTargetFactory::getInstance()
|
Chris@126
|
33 {
|
Chris@126
|
34 if (!m_instance) m_instance = new AudioTargetFactory();
|
Chris@126
|
35 return m_instance;
|
Chris@126
|
36 }
|
Chris@126
|
37
|
Chris@126
|
38 AudioTargetFactory::AudioTargetFactory()
|
Chris@126
|
39 {
|
Chris@126
|
40 }
|
Chris@126
|
41
|
Chris@126
|
42 std::vector<QString>
|
Chris@126
|
43 AudioTargetFactory::getCallbackTargetNames(bool includeAuto) const
|
Chris@126
|
44 {
|
Chris@126
|
45 std::vector<QString> names;
|
Chris@126
|
46 if (includeAuto) names.push_back("auto");
|
Chris@126
|
47
|
Chris@126
|
48 #ifdef HAVE_JACK
|
Chris@126
|
49 names.push_back("jack");
|
Chris@126
|
50 #endif
|
Chris@126
|
51
|
Chris@126
|
52 #ifdef HAVE_LIBPULSE
|
Chris@126
|
53 names.push_back("pulse");
|
Chris@126
|
54 #endif
|
Chris@126
|
55
|
Chris@126
|
56 #ifdef HAVE_PORTAUDIO_2_0
|
Chris@126
|
57 names.push_back("port");
|
Chris@126
|
58 #endif
|
Chris@126
|
59
|
Chris@126
|
60 return names;
|
Chris@126
|
61 }
|
Chris@126
|
62
|
Chris@126
|
63 QString
|
Chris@126
|
64 AudioTargetFactory::getCallbackTargetDescription(QString name) const
|
Chris@126
|
65 {
|
Chris@126
|
66 if (name == "auto") {
|
Chris@126
|
67 return QCoreApplication::translate("AudioTargetFactory",
|
Chris@126
|
68 "(auto)");
|
Chris@126
|
69 }
|
Chris@126
|
70 if (name == "jack") {
|
Chris@126
|
71 return QCoreApplication::translate("AudioTargetFactory",
|
Chris@126
|
72 "JACK Audio Connection Kit");
|
Chris@126
|
73 }
|
Chris@126
|
74 if (name == "pulse") {
|
Chris@126
|
75 return QCoreApplication::translate("AudioTargetFactory",
|
Chris@126
|
76 "PulseAudio Server");
|
Chris@126
|
77 }
|
Chris@126
|
78 if (name == "port") {
|
Chris@126
|
79 return QCoreApplication::translate("AudioTargetFactory",
|
Chris@126
|
80 "Default Soundcard Device");
|
Chris@126
|
81 }
|
Chris@126
|
82
|
Chris@126
|
83 return "(unknown)";
|
Chris@126
|
84 }
|
Chris@126
|
85
|
Chris@126
|
86 QString
|
Chris@126
|
87 AudioTargetFactory::getDefaultCallbackTarget() const
|
Chris@126
|
88 {
|
Chris@126
|
89 if (m_default == "") return "auto";
|
Chris@126
|
90 return m_default;
|
Chris@126
|
91 }
|
Chris@126
|
92
|
Chris@126
|
93 bool
|
Chris@126
|
94 AudioTargetFactory::isAutoCallbackTarget(QString name) const
|
Chris@126
|
95 {
|
Chris@126
|
96 return (name == "auto" || name == "");
|
Chris@126
|
97 }
|
Chris@126
|
98
|
Chris@126
|
99 void
|
Chris@126
|
100 AudioTargetFactory::setDefaultCallbackTarget(QString target)
|
Chris@126
|
101 {
|
Chris@126
|
102 m_default = target;
|
Chris@126
|
103 }
|
Chris@126
|
104
|
Chris@43
|
105 AudioCallbackPlayTarget *
|
Chris@43
|
106 AudioTargetFactory::createCallbackTarget(AudioCallbackPlaySource *source)
|
Chris@43
|
107 {
|
Chris@43
|
108 AudioCallbackPlayTarget *target = 0;
|
Chris@43
|
109
|
Chris@126
|
110 if (m_default != "" && m_default != "auto") {
|
Chris@126
|
111
|
Chris@126
|
112 #ifdef HAVE_JACK
|
Chris@126
|
113 if (m_default == "jack") target = new AudioJACKTarget(source);
|
Chris@126
|
114 #endif
|
Chris@126
|
115
|
Chris@126
|
116 #ifdef HAVE_LIBPULSE
|
Chris@126
|
117 if (m_default == "pulse") target = new AudioPulseAudioTarget(source);
|
Chris@126
|
118 #endif
|
Chris@126
|
119
|
Chris@126
|
120 #ifdef HAVE_PORTAUDIO_2_0
|
Chris@126
|
121 if (m_default == "port") target = new AudioPortAudioTarget(source);
|
Chris@126
|
122 #endif
|
Chris@126
|
123
|
Chris@126
|
124 if (!target || !target->isOK()) {
|
Chris@293
|
125 cerr << "WARNING: AudioTargetFactory::createCallbackTarget: Failed to open the requested target (\"" << m_default << "\")" << endl;
|
Chris@126
|
126 delete target;
|
Chris@126
|
127 return 0;
|
Chris@126
|
128 } else {
|
Chris@126
|
129 return target;
|
Chris@126
|
130 }
|
Chris@126
|
131 }
|
Chris@126
|
132
|
Chris@43
|
133 #ifdef HAVE_JACK
|
Chris@43
|
134 target = new AudioJACKTarget(source);
|
Chris@43
|
135 if (target->isOK()) return target;
|
Chris@43
|
136 else {
|
Chris@293
|
137 cerr << "WARNING: AudioTargetFactory::createCallbackTarget: Failed to open JACK target" << endl;
|
Chris@43
|
138 delete target;
|
Chris@43
|
139 }
|
Chris@43
|
140 #endif
|
Chris@117
|
141
|
Chris@117
|
142 #ifdef HAVE_LIBPULSE
|
Chris@117
|
143 target = new AudioPulseAudioTarget(source);
|
Chris@117
|
144 if (target->isOK()) return target;
|
Chris@117
|
145 else {
|
Chris@293
|
146 cerr << "WARNING: AudioTargetFactory::createCallbackTarget: Failed to open PulseAudio target" << endl;
|
Chris@117
|
147 delete target;
|
Chris@117
|
148 }
|
Chris@117
|
149 #endif
|
Chris@114
|
150
|
Chris@114
|
151 #ifdef HAVE_PORTAUDIO_2_0
|
Chris@43
|
152 target = new AudioPortAudioTarget(source);
|
Chris@43
|
153 if (target->isOK()) return target;
|
Chris@43
|
154 else {
|
Chris@293
|
155 cerr << "WARNING: AudioTargetFactory::createCallbackTarget: Failed to open PortAudio target" << endl;
|
Chris@43
|
156 delete target;
|
Chris@43
|
157 }
|
Chris@43
|
158 #endif
|
Chris@43
|
159
|
Chris@293
|
160 cerr << "WARNING: AudioTargetFactory::createCallbackTarget: No suitable targets available" << endl;
|
Chris@43
|
161 return 0;
|
Chris@43
|
162 }
|
Chris@43
|
163
|
Chris@43
|
164
|