Internal.hxx 9.48 KB
Newer Older
1
/*
2
 * Copyright 2003-2016 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
 */

Max Kellermann's avatar
Max Kellermann committed
20 21
#ifndef MPD_OUTPUT_INTERNAL_HXX
#define MPD_OUTPUT_INTERNAL_HXX
22

23
#include "AudioFormat.hxx"
24
#include "pcm/PcmBuffer.hxx"
25
#include "pcm/PcmDither.hxx"
26
#include "ReplayGainInfo.hxx"
27 28
#include "thread/Mutex.hxx"
#include "thread/Cond.hxx"
29
#include "thread/Thread.hxx"
30
#include "system/PeriodClock.hxx"
31

32
class Error;
33
class Filter;
34
class MusicPipe;
35
class EventLoop;
36 37
class Mixer;
class MixerListener;
38
struct MusicChunk;
39
struct ConfigBlock;
40
struct PlayerControl;
41
struct AudioOutputPlugin;
42

43 44 45 46 47 48
struct AudioOutput {
	enum class Command {
		NONE,
		ENABLE,
		DISABLE,
		OPEN,
49

50 51 52 53 54
		/**
		 * This command is invoked when the input audio format
		 * changes.
		 */
		REOPEN,
55

56 57
		CLOSE,
		PAUSE,
58

59 60 61 62 63
		/**
		 * Drains the internal (hardware) buffers of the device.  This
		 * operation may take a while to complete.
		 */
		DRAIN,
64

65 66 67
		CANCEL,
		KILL
	};
68

69 70 71
	/**
	 * The device's configured display name.
	 */
72 73
	const char *name;

74 75 76
	/**
	 * The plugin which implements this output device.
	 */
77
	const AudioOutputPlugin &plugin;
78

79 80
	/**
	 * The #mixer object associated with this audio output device.
81
	 * May be nullptr if none is available, or if software volume is
82 83
	 * configured.
	 */
84
	Mixer *mixer;
85

86 87 88 89 90 91 92
	/**
	 * Will this output receive tags from the decoder?  The
	 * default is true, but it may be configured to false to
	 * suppress sending tags to the output.
	 */
	bool tags;

93 94 95 96 97 98
	/**
	 * Shall this output always play something (i.e. silence),
	 * even when playback is stopped?
	 */
	bool always_on;

99 100 101 102 103
	/**
	 * Has the user enabled this device?
	 */
	bool enabled;

104 105 106 107 108 109
	/**
	 * Is this device actually enabled, i.e. the "enable" method
	 * has succeeded?
	 */
	bool really_enabled;

110 111
	/**
	 * Is the device (already) open and functional?
112 113 114 115 116
	 *
	 * This attribute may only be modified by the output thread.
	 * It is protected with #mutex: write accesses inside the
	 * output thread and read accesses outside of it may only be
	 * performed while the lock is held.
117
	 */
118
	bool open;
119

120 121 122 123 124 125
	/**
	 * Is the device paused?  i.e. the output thread is in the
	 * ao_pause() loop.
	 */
	bool pause;

126 127 128 129 130 131 132 133 134
	/**
	 * When this flag is set, the output thread will not do any
	 * playback.  It will wait until the flag is cleared.
	 *
	 * This is used to synchronize the "clear" operation on the
	 * shared music pipe during the CANCEL command.
	 */
	bool allow_play;

135 136 137 138 139 140 141 142 143 144 145 146 147 148 149
	/**
	 * True while the OutputThread is inside ao_play().  This
	 * means the PlayerThread does not need to wake up the
	 * OutputThread when new chunks are added to the MusicPipe,
	 * because the OutputThread is already watching that.
	 */
	bool in_playback_loop;

	/**
	 * Has the OutputThread been woken up to play more chunks?
	 * This is set by audio_output_play() and reset by ao_play()
	 * to reduce the number of duplicate wakeups.
	 */
	bool woken_for_play;

150
	/**
151
	 * If not nullptr, the device has failed, and this timer is used
152 153
	 * to estimate how long it should stay disabled (unless
	 * explicitly reopened with "play").
154
	 */
155
	PeriodClock fail_timer;
156

157 158 159
	/**
	 * The configured audio format.
	 */
160
	AudioFormat config_audio_format;
161

162 163 164 165
	/**
	 * The audio_format in which audio data is received from the
	 * player thread (which in turn receives it from the decoder).
	 */
166
	AudioFormat in_audio_format;
167 168 169

	/**
	 * The audio_format which is really sent to the device.  This
170 171
	 * is basically config_audio_format (if configured) or
	 * in_audio_format, but may have been modified by
172 173
	 * plugin->open().
	 */
174
	AudioFormat out_audio_format;
175

176 177 178
	/**
	 * The buffer used to allocate the cross-fading result.
	 */
179
	PcmBuffer cross_fade_buffer;
180

181 182 183 184 185
	/**
	 * The dithering state for cross-fading two streams.
	 */
	PcmDither cross_fade_dither;

186 187 188 189
	/**
	 * The filter object of this audio output.  This is an
	 * instance of chain_filter_plugin.
	 */
190
	Filter *filter;
191

192 193 194 195
	/**
	 * The replay_gain_filter_plugin instance of this audio
	 * output.
	 */
196
	Filter *replay_gain_filter;
197 198 199 200 201 202 203

	/**
	 * The serial number of the last replay gain info.  0 means no
	 * replay gain info was available.
	 */
	unsigned replay_gain_serial;

204 205 206 207 208
	/**
	 * The replay_gain_filter_plugin instance of this audio
	 * output, to be applied to the second chunk during
	 * cross-fading.
	 */
209
	Filter *other_replay_gain_filter;
210 211 212 213 214 215 216

	/**
	 * The serial number of the last replay gain info by the
	 * "other" chunk during cross-fading.
	 */
	unsigned other_replay_gain_serial;

217 218 219 220 221 222
	/**
	 * The convert_filter_plugin instance of this audio output.
	 * It is the last item in the filter chain, and is responsible
	 * for converting the input data into the appropriate format
	 * for this audio output.
	 */
223
	Filter *convert_filter;
224

225
	/**
226
	 * The thread handle, or nullptr if the output thread isn't
227 228
	 * running.
	 */
229
	Thread thread;
230 231 232 233

	/**
	 * The next command to be performed by the output thread.
	 */
234
	Command command;
235 236

	/**
237
	 * The music pipe which provides music chunks to be played.
238
	 */
239
	const MusicPipe *pipe;
240

241
	/**
242 243
	 * This mutex protects #open, #fail_timer, #current_chunk and
	 * #current_chunk_finished.
244
	 */
245
	Mutex mutex;
246

247 248 249 250
	/**
	 * This condition object wakes up the output thread after
	 * #command has been set.
	 */
251
	Cond cond;
252

253
	/**
254
	 * The PlayerControl object which "owns" this output.  This
255 256
	 * object is needed to signal command completion.
	 */
257
	PlayerControl *player_control;
258

259
	/**
260
	 * The #MusicChunk which is currently being played.  All
261 262 263 264
	 * chunks before this one may be returned to the
	 * #music_buffer, because they are not going to be used by
	 * this output anymore.
	 */
265
	const MusicChunk *current_chunk;
266 267

	/**
268
	 * Has the output finished playing #current_chunk?
269
	 */
270
	bool current_chunk_finished;
271

272
	AudioOutput(const AudioOutputPlugin &_plugin);
273
	~AudioOutput();
274

275
	bool Configure(const ConfigBlock &block, Error &error);
276 277 278 279 280 281 282 283 284 285 286

	void StartThread();
	void StopThread();

	void Finish();

	bool IsOpen() const {
		return open;
	}

	bool IsCommandFinished() const {
287
		return command == Command::NONE;
288 289 290 291 292 293 294 295 296 297 298 299 300 301
	}

	/**
	 * Waits for command completion.
	 *
	 * Caller must lock the mutex.
	 */
	void WaitForCommand();

	/**
	 * Sends a command, but does not wait for completion.
	 *
	 * Caller must lock the mutex.
	 */
302
	void CommandAsync(Command cmd);
303 304 305 306 307 308 309

	/**
	 * Sends a command to the #AudioOutput object and waits for
	 * completion.
	 *
	 * Caller must lock the mutex.
	 */
310
	void CommandWait(Command cmd);
311 312 313 314 315

	/**
	 * Lock the #AudioOutput object and execute the command
	 * synchronously.
	 */
316
	void LockCommandWait(Command cmd);
317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373

	/**
	 * Enables the device.
	 */
	void LockEnableWait();

	/**
	 * Disables the device.
	 */
	void LockDisableWait();

	void LockPauseAsync();

	/**
	 * Same LockCloseWait(), but expects the lock to be
	 * held by the caller.
	 */
	void CloseWait();
	void LockCloseWait();

	/**
	 * Closes the audio output, but if the "always_on" flag is set, put it
	 * into pause mode instead.
	 */
	void LockRelease();

	void SetReplayGainMode(ReplayGainMode mode);

	/**
	 * Caller must lock the mutex.
	 */
	bool Open(const AudioFormat audio_format, const MusicPipe &mp);

	/**
	 * Opens or closes the device, depending on the "enabled"
	 * flag.
	 *
	 * @return true if the device is open
	 */
	bool LockUpdate(const AudioFormat audio_format,
			const MusicPipe &mp);

	void LockPlay();

	void LockDrainAsync();

	/**
	 * Clear the "allow_play" flag and send the "CANCEL" command
	 * asynchronously.  To finish the operation, the caller has to
	 * call LockAllowPlay().
	 */
	void LockCancelAsync();

	/**
	 * Set the "allow_play" and signal the thread.
	 */
	void LockAllowPlay();
374 375 376 377 378 379 380 381 382 383 384

private:
	void CommandFinished();

	bool Enable();
	void Disable();

	void Open();
	void Close(bool drain);
	void Reopen();

385 386 387 388 389 390 391
	/**
	 * Close the output plugin.
	 *
	 * Mutex must not be locked.
	 */
	void CloseOutput(bool drain);

392
	AudioFormat OpenFilter(AudioFormat &format, Error &error_r);
393 394 395 396

	/**
	 * Mutex must not be locked.
	 */
397
	void CloseFilter();
398

399 400 401 402 403 404 405 406 407 408 409
	void ReopenFilter();

	/**
	 * Wait until the output's delay reaches zero.
	 *
	 * @return true if playback should be continued, false if a
	 * command was issued
	 */
	bool WaitForDelay();

	gcc_pure
410
	const MusicChunk *GetNextChunk() const;
411

412
	bool PlayChunk(const MusicChunk *chunk);
413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430

	/**
	 * Plays all remaining chunks, until the tail of the pipe has
	 * been reached (and no more chunks are queued), or until a
	 * command is received.
	 *
	 * @return true if at least one chunk has been available,
	 * false if the tail of the pipe was already reached
	 */
	bool Play();

	void Pause();

	/**
	 * The OutputThread.
	 */
	void Task();
	static void Task(void *arg);
431 432
};

433 434 435 436
/**
 * Notify object used by the thread's client, i.e. we will send a
 * notify signal to this object, expecting the caller to wait on it.
 */
437 438
extern struct notify audio_output_client_notify;

439
AudioOutput *
440
audio_output_new(EventLoop &event_loop, const ConfigBlock &block,
441
		 MixerListener &mixer_listener,
442
		 PlayerControl &pc,
443
		 Error &error);
444

445
void
446
audio_output_free(AudioOutput *ao);
447

448
#endif