audio: moved code to output_command.c
The output_command library provides a command interface to the audio outputs. It assumes the input comes from an untrusted source (i.e. the client) and verifies all parameters.
This commit is contained in:
parent
3bc4224bfd
commit
9d447dda1d
|
@ -45,6 +45,7 @@ mpd_headers = \
|
|||
output_control.h \
|
||||
output_state.h \
|
||||
output_print.h \
|
||||
output_command.h \
|
||||
output/shout_plugin.h \
|
||||
buffer2array.h \
|
||||
command.h \
|
||||
|
@ -146,6 +147,7 @@ mpd_SOURCES = \
|
|||
output_control.c \
|
||||
output_state.c \
|
||||
output_print.c \
|
||||
output_command.c \
|
||||
output_init.c \
|
||||
output/null_plugin.c \
|
||||
buffer2array.c \
|
||||
|
|
35
src/audio.c
35
src/audio.c
|
@ -19,12 +19,8 @@
|
|||
#include "audio.h"
|
||||
#include "audio_format.h"
|
||||
#include "audio_parser.h"
|
||||
#include "output_api.h"
|
||||
#include "output_control.h"
|
||||
#include "output_internal.h"
|
||||
#include "output_all.h"
|
||||
#include "path.h"
|
||||
#include "idle.h"
|
||||
#include "mixer_api.h"
|
||||
|
||||
#include <glib.h>
|
||||
|
@ -63,37 +59,6 @@ void finishAudioConfig(void)
|
|||
audio_format_clear(&configured_audio_format);
|
||||
}
|
||||
|
||||
int enableAudioDevice(unsigned int device)
|
||||
{
|
||||
struct audio_output *ao;
|
||||
|
||||
if (device >= audio_output_count())
|
||||
return -1;
|
||||
|
||||
ao = audio_output_get(device);
|
||||
|
||||
ao->reopen_after = 0;
|
||||
ao->enabled = true;
|
||||
idle_add(IDLE_OUTPUT);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int disableAudioDevice(unsigned int device)
|
||||
{
|
||||
struct audio_output *ao;
|
||||
|
||||
if (device >= audio_output_count())
|
||||
return -1;
|
||||
|
||||
ao = audio_output_get(device);
|
||||
|
||||
ao->enabled = false;
|
||||
idle_add(IDLE_OUTPUT);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
bool mixer_control_setvol(unsigned int device, int volume, int rel)
|
||||
{
|
||||
struct audio_output *output;
|
||||
|
|
|
@ -31,12 +31,6 @@ void initAudioConfig(void);
|
|||
|
||||
void finishAudioConfig(void);
|
||||
|
||||
/* these functions are called in the main parent process while the child
|
||||
process is busy playing to the audio */
|
||||
int enableAudioDevice(unsigned int device);
|
||||
|
||||
int disableAudioDevice(unsigned int device);
|
||||
|
||||
bool mixer_control_setvol(unsigned int device, int volume, int rel);
|
||||
bool mixer_control_getvol(unsigned int device, int *volume);
|
||||
|
||||
|
|
|
@ -34,7 +34,7 @@
|
|||
#include "log.h"
|
||||
#include "stored_playlist.h"
|
||||
#include "ack.h"
|
||||
#include "audio.h"
|
||||
#include "output_command.h"
|
||||
#include "output_print.h"
|
||||
#include "locate.h"
|
||||
#include "dbUtils.h"
|
||||
|
@ -1306,34 +1306,38 @@ static enum command_return
|
|||
handle_enableoutput(struct client *client, G_GNUC_UNUSED int argc, char *argv[])
|
||||
{
|
||||
unsigned device;
|
||||
int ret;
|
||||
bool ret;
|
||||
|
||||
if (!check_unsigned(client, &device, argv[1]))
|
||||
return COMMAND_RETURN_ERROR;
|
||||
|
||||
ret = enableAudioDevice(device);
|
||||
if (ret == -1)
|
||||
ret = audio_output_enable_index(device);
|
||||
if (!ret) {
|
||||
command_error(client, ACK_ERROR_NO_EXIST,
|
||||
"No such audio output");
|
||||
return COMMAND_RETURN_ERROR;
|
||||
}
|
||||
|
||||
return ret;
|
||||
return COMMAND_RETURN_OK;
|
||||
}
|
||||
|
||||
static enum command_return
|
||||
handle_disableoutput(struct client *client, G_GNUC_UNUSED int argc, char *argv[])
|
||||
{
|
||||
unsigned device;
|
||||
int ret;
|
||||
bool ret;
|
||||
|
||||
if (!check_unsigned(client, &device, argv[1]))
|
||||
return COMMAND_RETURN_ERROR;
|
||||
|
||||
ret = disableAudioDevice(device);
|
||||
if (ret == -1)
|
||||
ret = audio_output_disable_index(device);
|
||||
if (!ret) {
|
||||
command_error(client, ACK_ERROR_NO_EXIST,
|
||||
"No such audio output");
|
||||
return COMMAND_RETURN_ERROR;
|
||||
}
|
||||
|
||||
return ret;
|
||||
return COMMAND_RETURN_OK;
|
||||
}
|
||||
|
||||
static enum command_return
|
||||
|
|
|
@ -0,0 +1,62 @@
|
|||
/*
|
||||
* 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*/
|
||||
|
||||
/*
|
||||
* Glue functions for controlling the audio outputs over the MPD
|
||||
* protocol. These functions perform extra validation on all
|
||||
* parameters, because they might be from an untrusted source.
|
||||
*
|
||||
*/
|
||||
|
||||
#include "output_command.h"
|
||||
#include "output_all.h"
|
||||
#include "output_internal.h"
|
||||
#include "idle.h"
|
||||
|
||||
bool
|
||||
audio_output_enable_index(unsigned idx)
|
||||
{
|
||||
struct audio_output *ao;
|
||||
|
||||
if (idx >= audio_output_count())
|
||||
return false;
|
||||
|
||||
ao = audio_output_get(idx);
|
||||
|
||||
ao->reopen_after = 0;
|
||||
ao->enabled = true;
|
||||
idle_add(IDLE_OUTPUT);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool
|
||||
audio_output_disable_index(unsigned idx)
|
||||
{
|
||||
struct audio_output *ao;
|
||||
|
||||
if (idx >= audio_output_count())
|
||||
return false;
|
||||
|
||||
ao = audio_output_get(idx);
|
||||
|
||||
ao->enabled = false;
|
||||
idle_add(IDLE_OUTPUT);
|
||||
|
||||
return true;
|
||||
}
|
|
@ -0,0 +1,45 @@
|
|||
/*
|
||||
* 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*/
|
||||
|
||||
/*
|
||||
* Glue functions for controlling the audio outputs over the MPD
|
||||
* protocol. These functions perform extra validation on all
|
||||
* parameters, because they might be from an untrusted source.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef OUTPUT_COMMAND_H
|
||||
#define OUTPUT_COMMAND_H
|
||||
|
||||
#include <stdbool.h>
|
||||
|
||||
/**
|
||||
* Enables an audio output. Returns false if the specified output
|
||||
* does not exist.
|
||||
*/
|
||||
bool
|
||||
audio_output_enable_index(unsigned idx);
|
||||
|
||||
/**
|
||||
* Disables an audio output. Returns false if the specified output
|
||||
* does not exist.
|
||||
*/
|
||||
bool
|
||||
audio_output_disable_index(unsigned idx);
|
||||
|
||||
#endif
|
Loading…
Reference in New Issue