Commit b479a264 authored by Max Kellermann's avatar Max Kellermann

pulse: code rewrite using the asynchronous libpulse API

This is a complete rewrite of the PulseAudio output plugin. It uses the asynchronous API, which gives us more control over everything. Additionally, it connects to the PulseAudio server on startup, and keeps this connection up while MPD runs. During pause, instead of closing the stream, it enables "cork".
parent ac32f36e
...@@ -115,6 +115,7 @@ mpd_headers = \ ...@@ -115,6 +115,7 @@ mpd_headers = \
src/mapper.h \ src/mapper.h \
src/output/httpd_client.h \ src/output/httpd_client.h \
src/output/httpd_internal.h \ src/output/httpd_internal.h \
src/output/pulse_output_plugin.h \
src/page.h \ src/page.h \
src/pcm_buffer.h \ src/pcm_buffer.h \
src/pcm_utils.h \ src/pcm_utils.h \
......
...@@ -31,6 +31,7 @@ ver 0.16 (20??/??/??) ...@@ -31,6 +31,7 @@ ver 0.16 (20??/??/??)
- openal: new output plugin - openal: new output plugin
- pulse: announce "media.role=music" - pulse: announce "media.role=music"
- pulse: renamed context to "Music Player Daemon" - pulse: renamed context to "Music Player Daemon"
- pulse: connect to server on MPD startup, implement pause
* mixers: * mixers:
- removed support for legacy mixer configuration - removed support for legacy mixer configuration
- reimplemented software volume as mixer+filter plugin - reimplemented software volume as mixer+filter plugin
......
...@@ -726,7 +726,7 @@ AC_ARG_ENABLE(pulse, ...@@ -726,7 +726,7 @@ AC_ARG_ENABLE(pulse,
[enable support for the PulseAudio sound server]),, [enable support for the PulseAudio sound server]),,
enable_pulse=auto) enable_pulse=auto)
MPD_AUTO_PKG(pulse, PULSE, [libpulse-simple], MPD_AUTO_PKG(pulse, PULSE, [libpulse],
[PulseAudio output plugin], [libpulse not found]) [PulseAudio output plugin], [libpulse not found])
if test x$enable_pulse = xyes; then if test x$enable_pulse = xyes; then
AC_DEFINE([HAVE_PULSE], 1, AC_DEFINE([HAVE_PULSE], 1,
......
/*
* Copyright (C) 2003-2009 The Music Player Daemon Project
* http://www.musicpd.org
*
* 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.
*
* 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.
*/
#ifndef MPD_PULSE_OUTPUT_PLUGIN_H
#define MPD_PULSE_OUTPUT_PLUGIN_H
#include <stdbool.h>
#include <stddef.h>
#if !defined(PA_CHECK_VERSION)
/**
* This macro was implemented in libpulse 0.9.16.
*/
#define PA_CHECK_VERSION(a,b,c) false
#endif
struct pa_operation;
struct pulse_output {
const char *name;
const char *server;
const char *sink;
struct pa_threaded_mainloop *mainloop;
struct pa_context *context;
struct pa_stream *stream;
size_t writable;
#if !PA_CHECK_VERSION(0,9,11)
/**
* We need this variable because pa_stream_is_corked() wasn't
* added before 0.9.11.
*/
bool pause;
#endif
};
void
pulse_output_context_state_cb(struct pa_context *context, void *userdata);
#endif
...@@ -21,6 +21,8 @@ ...@@ -21,6 +21,8 @@
#include "mixer_list.h" #include "mixer_list.h"
#include "filter_registry.h" #include "filter_registry.h"
#include "pcm_volume.h" #include "pcm_volume.h"
#include "output/pulse_output_plugin.h"
#include "event_pipe.h"
#include <glib.h> #include <glib.h>
...@@ -28,6 +30,17 @@ ...@@ -28,6 +30,17 @@
#include <string.h> #include <string.h>
#include <unistd.h> #include <unistd.h>
void
pulse_output_context_state_cb(G_GNUC_UNUSED struct pa_context *context,
G_GNUC_UNUSED void *userdata)
{
}
void
event_pipe_emit(G_GNUC_UNUSED enum pipe_event event)
{
}
const struct filter_plugin * const struct filter_plugin *
filter_plugin_by_name(G_GNUC_UNUSED const char *name) filter_plugin_by_name(G_GNUC_UNUSED const char *name)
{ {
......
...@@ -24,6 +24,7 @@ ...@@ -24,6 +24,7 @@
#include "audio_parser.h" #include "audio_parser.h"
#include "filter_registry.h" #include "filter_registry.h"
#include "pcm_convert.h" #include "pcm_convert.h"
#include "event_pipe.h"
#include <glib.h> #include <glib.h>
...@@ -31,6 +32,11 @@ ...@@ -31,6 +32,11 @@
#include <string.h> #include <string.h>
#include <unistd.h> #include <unistd.h>
void
event_pipe_emit(G_GNUC_UNUSED enum pipe_event event)
{
}
void pcm_convert_init(G_GNUC_UNUSED struct pcm_convert_state *state) void pcm_convert_init(G_GNUC_UNUSED struct pcm_convert_state *state)
{ {
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment