Internal.hxx 9.54 KB
Newer Older
1
/*
Max Kellermann's avatar
Max Kellermann committed
2
 * Copyright (C) 2003-2014 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 config_param;
40
struct PlayerControl;
41
struct AudioOutputPlugin;
42

43 44
enum audio_output_command {
	AO_COMMAND_NONE = 0,
45 46
	AO_COMMAND_ENABLE,
	AO_COMMAND_DISABLE,
47
	AO_COMMAND_OPEN,
48 49 50 51 52 53 54

	/**
	 * This command is invoked when the input audio format
	 * changes.
	 */
	AO_COMMAND_REOPEN,

55 56
	AO_COMMAND_CLOSE,
	AO_COMMAND_PAUSE,
57 58 59 60 61 62 63

	/**
	 * Drains the internal (hardware) buffers of the device.  This
	 * operation may take a while to complete.
	 */
	AO_COMMAND_DRAIN,

64 65 66 67
	AO_COMMAND_CANCEL,
	AO_COMMAND_KILL
};

68
struct AudioOutput {
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
	enum audio_output_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 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 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

	bool Configure(const config_param &param, Error &error);

	void StartThread();
	void StopThread();

	void Finish();

	bool IsOpen() const {
		return open;
	}

	bool IsCommandFinished() const {
		return command == AO_COMMAND_NONE;
	}

	/**
	 * 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.
	 */
	void CommandAsync(audio_output_command cmd);

	/**
	 * Sends a command to the #AudioOutput object and waits for
	 * completion.
	 *
	 * Caller must lock the mutex.
	 */
	void CommandWait(audio_output_command cmd);

	/**
	 * Lock the #AudioOutput object and execute the command
	 * synchronously.
	 */
	void LockCommandWait(audio_output_command cmd);

	/**
	 * 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 385

private:
	void CommandFinished();

	bool Enable();
	void Disable();

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

	AudioFormat OpenFilter(AudioFormat &format, Error &error_r);
386 387 388 389

	/**
	 * Mutex must not be locked.
	 */
390
	void CloseFilter();
391

392 393 394 395 396 397 398 399 400 401 402
	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
403
	const MusicChunk *GetNextChunk() const;
404

405
	bool PlayChunk(const MusicChunk *chunk);
406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423

	/**
	 * 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);
424 425
};

426 427 428 429
/**
 * 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.
 */
430 431
extern struct notify audio_output_client_notify;

432
AudioOutput *
433
audio_output_new(EventLoop &event_loop, const config_param &param,
434
		 MixerListener &mixer_listener,
435
		 PlayerControl &pc,
436
		 Error &error);
437

438
void
439
audio_output_free(AudioOutput *ao);
440

441
#endif