31 #ifdef USING_PULSEOUTPUT
43 #include "libavcodec/avcodec.h"
47 #define LOC QString("AO: ")
57 const QString &main_device,
const QString &passthru_device,
58 AudioFormat format,
int channels, AVCodecID codec,
int samplerate,
63 main_device, passthru_device, format, channels, codec, samplerate,
64 source, set_initial_vol, passthru, upmixer_startup, custom);
70 const QString &main_device,
const QString &passthru_device,
75 return OpenAudio(settings, willsuspendpa);
86 willsuspendpa =
false;
89 bool pulsestatus =
false;
92 static bool warned =
false;
96 LOG(VB_GENERAL, LOG_WARNING,
97 "WARNING: ***Pulse Audio is running***");
100 #endif // USING_PULSE
104 if (main_device.startsWith(
"PulseAudio:"))
106 #ifdef USING_PULSEOUTPUT
109 LOG(VB_GENERAL, LOG_ERR,
"Audio output device is set to PulseAudio "
110 "but PulseAudio support is not compiled in!");
112 #endif // USING_PULSEOUTPUT
114 if (main_device.startsWith(
"NULL"))
122 bool ispulse =
false;
126 if (main_device.startsWith(
"ALSA:"))
128 QString device_name = main_device;
130 device_name.remove(0, 5);
131 QMap<QString, QString> *alsadevs =
133 if (!alsadevs->empty() && alsadevs->contains(device_name))
135 if (alsadevs->value(device_name).contains(
"pulse",
136 Qt::CaseInsensitive))
144 if (main_device.contains(
"pulse", Qt::CaseInsensitive))
153 #else // !USING_PULSE
155 Q_UNUSED(willsuspendpa);
156 #endif // USING_PULSE
158 if (main_device.startsWith(
"ALSA:"))
164 LOG(VB_GENERAL, LOG_ERR,
"Audio output device is set to an ALSA device "
165 "but ALSA support is not compiled in!");
168 else if (main_device.startsWith(
"JACK:"))
174 LOG(VB_GENERAL, LOG_ERR,
"Audio output device is set to a JACK device "
175 "but JACK support is not compiled in!");
178 else if (main_device.startsWith(
"DirectX:"))
183 LOG(VB_GENERAL, LOG_ERR,
"Audio output device is set to DirectX device "
184 "but DirectX support is not compiled in!");
187 else if (main_device.startsWith(
"Windows:"))
192 LOG(VB_GENERAL, LOG_ERR,
"Audio output device is set to a Windows "
193 "device but Windows support is not compiled "
197 else if (main_device.startsWith(
"OpenSLES:"))
202 LOG(VB_GENERAL, LOG_ERR,
"Audio output device is set to a OpenSLES "
203 "device but Android support is not compiled "
207 else if (main_device.startsWith(
"AudioTrack:"))
212 LOG(VB_GENERAL, LOG_ERR,
"Audio output device is set to AudioTrack "
213 "device but Android support is not compiled "
217 #if defined(USING_OSS)
220 #elif defined(Q_OS_DARWIN)
227 LOG(VB_GENERAL, LOG_CRIT,
"No useable audio output driver found.");
228 LOG(VB_GENERAL, LOG_ERR,
"Don't disable OSS support unless you're "
229 "not running on Linux.");
289 LOG(VB_GENERAL, LOG_WARNING,
"AudioOutput Warning: " +
m_lastWarn);
303 QString &name,
const QString &desc,
bool willsuspendpa)
317 QString msg = tr(
"Invalid or unuseable audio device");
321 QString capabilities = desc;
327 capabilities += tr(
" (%1 connected to %2)")
333 capabilities += tr(
" (No connection detected)");
338 switch (max_channels)
351 capabilities += tr(
"\nDevice supports up to %1")
366 (
static_cast<int>(aosettings.
canLPCM()) << 0) |
367 (
static_cast<int>(aosettings.
canAC3()) << 1) |
368 (
static_cast<int>(aosettings.
canDTS()) << 2);
369 static const std::array<const std::string,3> s_typeNames {
"LPCM",
"AC3",
"DTS" };
373 capabilities += QObject::tr(
" (guessing: ");
374 bool found_one =
false;
375 for (
unsigned int i = 0; i < 3; i++)
377 if ((mask & (1 << i)) != 0)
380 capabilities +=
", ";
381 capabilities += QString::fromStdString(s_typeNames[i]);
385 capabilities += QString(
")");
389 LOG(VB_AUDIO, LOG_INFO, QString(
"Found %1 (%2)") .arg(name, capabilities));
391 adc->m_settings = aosettings;
399 QFileInfoList entries = dir.entryInfoList();
400 for (
const auto& fi : qAsConst(entries))
402 QString name = fi.absoluteFilePath();
403 QString desc = AudioOutput::tr(
"OSS device");
425 if (!alsadevs->empty())
427 for (
auto i = alsadevs->cbegin(); i != alsadevs->cend(); ++i)
429 const QString& key = i.key();
430 const QString& desc = i.value();
431 QString devname = QString(
"ALSA:%1").arg(key);
444 QDir dev(
"/dev",
"dsp*", QDir::Name, QDir::System);
446 dev.setNameFilters(QStringList(
"adsp*"));
449 dev.setPath(
"/dev/sound");
452 dev.setNameFilters(QStringList(
"dsp*"));
454 dev.setNameFilters(QStringList(
"adsp*"));
461 QString name =
"JACK:";
462 QString desc = tr(
"Use JACK default sound server.");
477 for (QMap<QString, QString>::const_iterator i = devs->begin();
478 i != devs->end(); ++i)
480 QString key = i.key();
481 QString desc = i.value();
482 QString devname = QString(
"CoreAudio:%1").arg(key);
492 QString name =
"CoreAudio:Default Output Device";
493 QString desc = tr(
"CoreAudio default output");
504 QString name =
"Windows:";
505 QString desc =
"Windows default output";
515 if (!dxdevs->empty())
517 for (QMap<int, QString>::const_iterator i = dxdevs->begin();
518 i != dxdevs->end(); ++i)
520 QString devdesc = i.value();
521 QString devname = QString(
"DirectX:%1").arg(devdesc);
539 #ifdef USING_PULSEOUTPUT
541 QString name =
"PulseAudio:default";
542 QString desc = tr(
"PulseAudio default sound server.");
554 QString name =
"OpenSLES:";
555 QString desc = tr(
"OpenSLES default output. Stereo support only.");
564 QString name =
"AudioTrack:";
565 QString desc = tr(
"Android AudioTrack output. Supports surround sound.");
575 QString name =
"NULL";
576 QString desc =
"NULL device";
594 uint8_t *buffer,
int &data_size,
597 bool got_frame =
false;
602 if (!(
m_frame = av_frame_alloc()))
604 return AVERROR(ENOMEM);
618 int ret = avcodec_receive_frame(ctx,
m_frame);
621 if (ret == AVERROR(EAGAIN))
624 ret = avcodec_send_packet(ctx, pkt);
625 if (ret == AVERROR(EAGAIN))
630 LOG(VB_AUDIO, LOG_ERR,
LOC +
631 QString(
"audio decode error: %1 (%2)")
641 LOG(VB_AUDIO, LOG_DEBUG,
LOC +
642 QString(
"audio decode, no frame decoded (%1)").arg(ret));
646 auto format = (AVSampleFormat)
m_frame->format;
650 data_size =
m_frame->nb_samples *
m_frame->ch_layout.nb_channels * av_get_bytes_per_sample(format);
654 uint8_t* src =
nullptr;
656 if (av_sample_fmt_is_planar(format))
661 (
const uint8_t **)
m_frame->extended_data,
667 src =
m_frame->extended_data[0];
670 uint8_t* transit = buffer;
676 transit = (uint8_t*)av_malloc(data_size * av_get_bytes_per_sample(ctx->sample_fmt)
680 LOG(VB_AUDIO, LOG_ERR,
LOC +
681 QString(
"audio decode, out of memory"));
688 data_size = converter.
Process(transit, src, data_size,
true);
690 if (transit != buffer)