JackOutputPlugin.cxx 15.4 KB
Newer Older
1
/*
Max Kellermann's avatar
Max Kellermann committed
2
 * Copyright 2003-2017 The Music Player Daemon Project
3
 * http://www.musicpd.org
4 5 6 7 8 9 10 11 12 13
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
14 15 16 17
 *
 * You should have received a copy of the GNU General Public License along
 * with this program; if not, write to the Free Software Foundation, Inc.,
 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
18 19
 */

20
#include "config.h"
21
#include "JackOutputPlugin.hxx"
22
#include "../OutputAPI.hxx"
23
#include "../Wrapper.hxx"
24
#include "config/ConfigError.hxx"
25
#include "util/ScopeExit.hxx"
26
#include "util/ConstBuffer.hxx"
27
#include "util/IterableSplitString.hxx"
28
#include "util/RuntimeError.hxx"
29
#include "util/Domain.hxx"
30
#include "Log.hxx"
31

32 33
#include <assert.h>

34 35 36 37
#include <jack/jack.h>
#include <jack/types.h>
#include <jack/ringbuffer.h>

38
#include <unistd.h> /* for usleep() */
39 40
#include <stdlib.h>

41
static constexpr unsigned MAX_PORTS = 16;
42

43
static constexpr size_t jack_sample_size = sizeof(jack_default_audio_sample_t);
44

45
struct JackOutput {
46
	AudioOutput base;
47

48 49 50
	/**
	 * libjack options passed to jack_client_open().
	 */
51
	jack_options_t options = JackNullOption;
52

53
	const char *name;
54

55
	const char *const server_name;
56

57
	/* configuration */
58

59
	std::string source_ports[MAX_PORTS];
60 61
	unsigned num_source_ports;

62
	std::string destination_ports[MAX_PORTS];
63
	unsigned num_destination_ports;
64

65
	size_t ringbuffer_size;
66

67
	/* the current audio format */
68
	AudioFormat audio_format;
69

70
	/* jack library stuff */
71
	jack_port_t *ports[MAX_PORTS];
72
	jack_client_t *client;
73
	jack_ringbuffer_t *ringbuffer[MAX_PORTS];
74

75
	bool shutdown;
76 77 78 79 80 81

	/**
	 * While this flag is set, the "process" callback generates
	 * silence.
	 */
	bool pause;
82

83
	explicit JackOutput(const ConfigBlock &block);
84

85 86 87 88 89 90 91
	/**
	 * Connect the JACK client and performs some basic setup
	 * (e.g. register callbacks).
	 *
	 * Throws #std::runtime_error on error.
	 */
	void Connect();
92 93 94 95 96 97 98 99

	/**
	 * Disconnect the JACK client.
	 */
	void Disconnect();

	void Shutdown() {
		shutdown = true;
100
	}
101

102
	void Enable();
103 104
	void Disable();

105
	void Open(AudioFormat &new_audio_format);
106

107 108 109 110
	void Close() {
		Stop();
	}

111 112 113 114
	/**
	 * Throws #std::runtime_error on error.
	 */
	void Start();
115 116 117 118 119 120 121
	void Stop();

	/**
	 * Determine the number of frames guaranteed to be available
	 * on all channels.
	 */
	gcc_pure
122
	jack_nframes_t GetAvailable() const noexcept;
123 124 125

	void Process(jack_nframes_t nframes);

126 127 128
	/**
	 * @return the number of frames that were written
	 */
129
	size_t WriteSamples(const float *src, size_t n_frames);
130

131
	std::chrono::steady_clock::duration Delay() const noexcept {
132
		return base.pause && pause && !shutdown
133 134
			? std::chrono::seconds(1)
			: std::chrono::steady_clock::duration::zero();
135 136
	}

137
	size_t Play(const void *chunk, size_t size);
138 139

	bool Pause();
140
};
141

142
static constexpr Domain jack_output_domain("jack_output");
143

144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216
/**
 * Throws #std::runtime_error on error.
 */
static unsigned
parse_port_list(const char *source, std::string dest[])
{
	unsigned n = 0;
	for (auto i : IterableSplitString(source, ',')) {
		if (n >= MAX_PORTS)
			throw std::runtime_error("too many port names");

		dest[n++] = std::string(i.data, i.size);
	}

	if (n == 0)
		throw std::runtime_error("at least one port name expected");

	return n;
}

JackOutput::JackOutput(const ConfigBlock &block)
	:base(jack_output_plugin, block),
	 name(block.GetBlockValue("client_name", nullptr)),
	 server_name(block.GetBlockValue("server_name", nullptr))
{
	if (name != nullptr)
		options = jack_options_t(options | JackUseExactName);
	else
		/* if there's a no configured client name, we don't
		   care about the JackUseExactName option */
		name = "Music Player Daemon";

	if (server_name != nullptr)
		options = jack_options_t(options | JackServerName);

	if (!block.GetBlockValue("autostart", false))
		options = jack_options_t(options | JackNoStartServer);

	/* configure the source ports */

	const char *value = block.GetBlockValue("source_ports", "left,right");
	num_source_ports = parse_port_list(value, source_ports);

	/* configure the destination ports */

	value = block.GetBlockValue("destination_ports", nullptr);
	if (value == nullptr) {
		/* compatibility with MPD < 0.16 */
		value = block.GetBlockValue("ports", nullptr);
		if (value != nullptr)
			FormatWarning(jack_output_domain,
				      "deprecated option 'ports' in line %d",
				      block.line);
	}

	if (value != nullptr) {
		num_destination_ports =
			parse_port_list(value, destination_ports);
	} else {
		num_destination_ports = 0;
	}

	if (num_destination_ports > 0 &&
	    num_destination_ports != num_source_ports)
		FormatWarning(jack_output_domain,
			      "number of source ports (%u) mismatches the "
			      "number of destination ports (%u) in line %d",
			      num_source_ports, num_destination_ports,
			      block.line);

	ringbuffer_size = block.GetBlockValue("ringbuffer_size", 32768u);
}

217
inline jack_nframes_t
218
JackOutput::GetAvailable() const noexcept
219
{
220
	size_t min = jack_ringbuffer_read_space(ringbuffer[0]);
221

222 223
	for (unsigned i = 1; i < audio_format.channels; ++i) {
		size_t current = jack_ringbuffer_read_space(ringbuffer[i]);
224 225 226 227
		if (current < min)
			min = current;
	}

228
	assert(min % jack_sample_size == 0);
229

230
	return min / jack_sample_size;
231 232
}

233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297
/**
 * Call jack_ringbuffer_read_advance() on all buffers in the list.
 */
static void
MultiReadAdvance(ConstBuffer<jack_ringbuffer_t *> buffers,
		 size_t size)
{
	for (auto *i : buffers)
		jack_ringbuffer_read_advance(i, size);
}

/**
 * Write a specific amount of "silence" to the given port.
 */
static void
WriteSilence(jack_port_t &port, jack_nframes_t nframes)
{
	jack_default_audio_sample_t *out =
		(jack_default_audio_sample_t *)
		jack_port_get_buffer(&port, nframes);
	if (out == nullptr)
		/* workaround for libjack1 bug: if the server
		   connection fails, the process callback is invoked
		   anyway, but unable to get a buffer */
			return;

	std::fill_n(out, nframes, 0.0);
}

/**
 * Write a specific amount of "silence" to all ports in the list.
 */
static void
MultiWriteSilence(ConstBuffer<jack_port_t *> ports, jack_nframes_t nframes)
{
	for (auto *i : ports)
		WriteSilence(*i, nframes);
}

/**
 * Copy data from the buffer to the port.  If the buffer underruns,
 * fill with silence.
 */
static void
Copy(jack_port_t &dest, jack_nframes_t nframes,
     jack_ringbuffer_t &src, jack_nframes_t available)
{
	jack_default_audio_sample_t *out =
		(jack_default_audio_sample_t *)
		jack_port_get_buffer(&dest, nframes);
	if (out == nullptr)
		/* workaround for libjack1 bug: if the server
		   connection fails, the process callback is
		   invoked anyway, but unable to get a
		   buffer */
		return;

	/* copy from buffer to port */
	jack_ringbuffer_read(&src, (char *)out,
			     available * jack_sample_size);

	/* ringbuffer underrun, fill with silence */
	std::fill(out + available, out + nframes, 0.0);
}

298 299
inline void
JackOutput::Process(jack_nframes_t nframes)
300
{
Max Kellermann's avatar
Max Kellermann committed
301
	if (nframes <= 0)
302
		return;
303

304
	jack_nframes_t available = GetAvailable();
305

306 307
	const unsigned n_channels = audio_format.channels;

308
	if (pause) {
309 310
		/* empty the ring buffers */

311 312
		MultiReadAdvance({ringbuffer, n_channels},
				 available * jack_sample_size);
313

314 315
		/* generate silence while MPD is paused */

316
		MultiWriteSilence({ports, n_channels}, nframes);
317

318
		return;
319 320
	}

321 322
	if (available > nframes)
		available = nframes;
323

324 325
	for (unsigned i = 0; i < n_channels; ++i)
		Copy(*ports[i], nframes, *ringbuffer[i], available);
326

327 328
	/* generate silence for the unused source ports */

329 330
	MultiWriteSilence({ports + n_channels, num_source_ports - n_channels},
			  nframes);
331 332 333 334 335 336
}

static int
mpd_jack_process(jack_nframes_t nframes, void *arg)
{
	JackOutput &jo = *(JackOutput *) arg;
337

338
	jo.Process(nframes);
339 340 341
	return 0;
}

342 343
static void
mpd_jack_shutdown(void *arg)
344
{
345 346 347
	JackOutput &jo = *(JackOutput *) arg;

	jo.Shutdown();
348 349
}

350
static void
351
set_audioformat(JackOutput *jd, AudioFormat &audio_format)
352
{
353
	audio_format.sample_rate = jack_get_sample_rate(jd->client);
354

355
	if (jd->num_source_ports == 1)
356 357 358
		audio_format.channels = 1;
	else if (audio_format.channels > jd->num_source_ports)
		audio_format.channels = 2;
359

360 361 362 363
	/* JACK uses 32 bit float in the range [-1 .. 1] - just like
	   MPD's SampleFormat::FLOAT*/
	static_assert(jack_sample_size == sizeof(float), "Expected float32");
	audio_format.format = SampleFormat::FLOAT;
364 365
}

366 367
static void
mpd_jack_error(const char *msg)
368
{
369
	LogError(jack_output_domain, msg);
370 371
}

372
#ifdef HAVE_JACK_SET_INFO_FUNCTION
373 374 375
static void
mpd_jack_info(const char *msg)
{
376
	LogDefault(jack_output_domain, msg);
377
}
378
#endif
379

380 381
void
JackOutput::Disconnect()
382
{
383
	assert(client != nullptr);
384

385 386 387
	jack_deactivate(client);
	jack_client_close(client);
	client = nullptr;
388 389
}

390 391
void
JackOutput::Connect()
392
{
393
	shutdown = false;
394

395
	jack_status_t status;
396
	client = jack_client_open(name, options, &status, server_name);
397 398 399
	if (client == nullptr)
		throw FormatRuntimeError("Failed to connect to JACK server, status=%d",
					 status);
400

401 402
	jack_set_process_callback(client, mpd_jack_process, this);
	jack_on_shutdown(client, mpd_jack_shutdown, this);
403

404 405 406 407 408 409 410
	for (unsigned i = 0; i < num_source_ports; ++i) {
		ports[i] = jack_port_register(client,
					      source_ports[i].c_str(),
					      JACK_DEFAULT_AUDIO_TYPE,
					      JackPortIsOutput, 0);
		if (ports[i] == nullptr) {
			Disconnect();
411 412
			throw FormatRuntimeError("Cannot register output port \"%s\"",
						 source_ports[i].c_str());
413 414 415 416 417 418 419 420 421 422
		}
	}
}

static bool
mpd_jack_test_default_device(void)
{
	return true;
}

423 424
inline void
JackOutput::Enable()
425 426 427 428
{
	for (unsigned i = 0; i < num_source_ports; ++i)
		ringbuffer[i] = nullptr;

429
	Connect();
430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446
}

inline void
JackOutput::Disable()
{
	if (client != nullptr)
		Disconnect();

	for (unsigned i = 0; i < num_source_ports; ++i) {
		if (ringbuffer[i] != nullptr) {
			jack_ringbuffer_free(ringbuffer[i]);
			ringbuffer[i] = nullptr;
		}
	}
}

static AudioOutput *
447
mpd_jack_init(const ConfigBlock &block)
448
{
449
	jack_set_error_function(mpd_jack_error);
450 451

#ifdef HAVE_JACK_SET_INFO_FUNCTION
452
	jack_set_info_function(mpd_jack_info);
453
#endif
454

455
	auto *jd = new JackOutput(block);
456
	return &jd->base;
457 458
}

459 460 461
/**
 * Stops the playback on the JACK connection.
 */
462 463
void
JackOutput::Stop()
464
{
465
	if (client == nullptr)
466
		return;
467

468
	if (shutdown)
469
		/* the connection has failed; close it */
470
		Disconnect();
471 472
	else
		/* the connection is alive: just stop playback */
473
		jack_deactivate(client);
474
}
475

476 477
inline void
JackOutput::Start()
478
{
479 480
	assert(client != nullptr);
	assert(audio_format.channels <= num_source_ports);
481

482 483 484 485
	/* allocate the ring buffers on the first open(); these
	   persist until MPD exits.  It's too unsafe to delete them
	   because we can never know when mpd_jack_process() gets
	   called */
486 487 488 489
	for (unsigned i = 0; i < num_source_ports; ++i) {
		if (ringbuffer[i] == nullptr)
			ringbuffer[i] =
				jack_ringbuffer_create(ringbuffer_size);
490

491 492
		/* clear the ring buffer to be sure that data from
		   previous playbacks are gone */
493
		jack_ringbuffer_reset(ringbuffer[i]);
494 495
	}

496 497
	if ( jack_activate(client) ) {
		Stop();
498
		throw std::runtime_error("cannot activate client");
499 500
	}

501 502 503
	const char *dports[MAX_PORTS], **jports;
	unsigned num_dports;
	if (num_destination_ports == 0) {
504 505
		/* no output ports were configured - ask libjack for
		   defaults */
506
		jports = jack_get_ports(client, nullptr, nullptr,
507
					JackPortIsPhysical | JackPortIsInput);
508
		if (jports == nullptr) {
509
			Stop();
510
			throw std::runtime_error("no ports found");
511 512
		}

513
		assert(*jports != nullptr);
514

515 516 517
		for (num_dports = 0; num_dports < MAX_PORTS &&
			     jports[num_dports] != nullptr;
		     ++num_dports) {
518 519
			FormatDebug(jack_output_domain,
				    "destination_port[%u] = '%s'\n",
520 521 522
				    num_dports,
				    jports[num_dports]);
			dports[num_dports] = jports[num_dports];
523
		}
524 525 526
	} else {
		/* use the configured output ports */

527 528 529
		num_dports = num_destination_ports;
		for (unsigned i = 0; i < num_dports; ++i)
			dports[i] = destination_ports[i].c_str();
530

531
		jports = nullptr;
532 533
	}

534 535
	AtScopeExit(jports) { free(jports); };

536
	assert(num_dports > 0);
537

538
	const char *duplicate_port = nullptr;
539
	if (audio_format.channels >= 2 && num_dports == 1) {
540 541
		/* mix stereo signal on one speaker */

542 543
		std::fill(dports + num_dports, dports + audio_format.channels,
			  dports[0]);
544 545
	} else if (num_dports > audio_format.channels) {
		if (audio_format.channels == 1 && num_dports > 2) {
546 547
			/* mono input file: connect the one source
			   channel to the both destination channels */
548 549
			duplicate_port = dports[1];
			num_dports = 1;
550 551
		} else
			/* connect only as many ports as we need */
552
			num_dports = audio_format.channels;
553 554
	}

555
	assert(num_dports <= num_source_ports);
556

557 558 559
	for (unsigned i = 0; i < num_dports; ++i) {
		int ret = jack_connect(client, jack_port_name(ports[i]),
				       dports[i]);
560
		if (ret != 0) {
561
			Stop();
562 563
			throw FormatRuntimeError("Not a valid JACK port: %s",
						 dports[i]);
564
		}
565 566
	}

567
	if (duplicate_port != nullptr) {
568 569 570 571
		/* mono input file: connect the one source channel to
		   the both destination channels */
		int ret;

572
		ret = jack_connect(client, jack_port_name(ports[0]),
573
				   duplicate_port);
574
		if (ret != 0) {
575
			Stop();
576 577
			throw FormatRuntimeError("Not a valid JACK port: %s",
						 duplicate_port);
578 579
		}
	}
580 581
}

582 583
inline void
JackOutput::Open(AudioFormat &new_audio_format)
584
{
585
	pause = false;
586

587 588
	if (client != nullptr && shutdown)
		Disconnect();
589

590 591
	if (client == nullptr)
		Connect();
592

593 594
	set_audioformat(this, new_audio_format);
	audio_format = new_audio_format;
595

596
	Start();
597
}
598

599
inline size_t
600
JackOutput::WriteSamples(const float *src, size_t n_frames)
601
{
602 603
	assert(n_frames > 0);

604
	const unsigned n_channels = audio_format.channels;
605

606 607 608 609 610 611 612 613 614 615
	float *dest[MAX_CHANNELS];
	size_t space = -1;
	for (unsigned i = 0; i < n_channels; ++i) {
		jack_ringbuffer_data_t d[2];
		jack_ringbuffer_get_write_vector(ringbuffer[i], d);

		/* choose the first non-empty writable area */
		const jack_ringbuffer_data_t &e = d[d[0].len == 0];

		if (e.len < space)
616
			/* send data symmetrically */
Max Kellermann's avatar
Max Kellermann committed
617
			space = e.len;
618 619

		dest[i] = (float *)e.buf;
620 621 622 623 624 625 626
	}

	space /= jack_sample_size;
	if (space == 0)
		return 0;

	const size_t result = n_frames = std::min(space, n_frames);
627

628
	while (n_frames-- > 0)
629 630 631 632 633 634 635
		for (unsigned i = 0; i < n_channels; ++i)
			*dest[i]++ = *src++;

	const size_t per_channel_advance = result * jack_sample_size;
	for (unsigned i = 0; i < n_channels; ++i)
		jack_ringbuffer_write_advance(ringbuffer[i],
					      per_channel_advance);
636 637

	return result;
638 639
}

640
inline size_t
641
JackOutput::Play(const void *chunk, size_t size)
642
{
643
	pause = false;
644

645
	const size_t frame_size = audio_format.GetFrameSize();
646
	assert(size % frame_size == 0);
647
	size /= frame_size;
648

649
	while (true) {
650 651 652
		if (shutdown)
			throw std::runtime_error("Refusing to play, because "
						 "there is no client thread");
653

654 655 656 657
		size_t frames_written =
			WriteSamples((const float *)chunk, size);
		if (frames_written > 0)
			return frames_written * frame_size;
658

659 660
		/* XXX do something more intelligent to
		   synchronize */
661
		usleep(1000);
662
	}
663 664
}

665 666
inline bool
JackOutput::Pause()
667
{
668
	if (shutdown)
669 670
		return false;

671
	pause = true;
672 673 674 675

	return true;
}

676 677
typedef AudioOutputWrapper<JackOutput> Wrapper;

678
const struct AudioOutputPlugin jack_output_plugin = {
679 680 681
	"jack",
	mpd_jack_test_default_device,
	mpd_jack_init,
682 683 684 685 686 687
	&Wrapper::Finish,
	&Wrapper::Enable,
	&Wrapper::Disable,
	&Wrapper::Open,
	&Wrapper::Close,
	&Wrapper::Delay,
688
	nullptr,
689
	&Wrapper::Play,
690 691
	nullptr,
	nullptr,
692
	&Wrapper::Pause,
693
	nullptr,
694
};