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_control.h \
|
||||||
output_state.h \
|
output_state.h \
|
||||||
output_print.h \
|
output_print.h \
|
||||||
|
output_command.h \
|
||||||
output/shout_plugin.h \
|
output/shout_plugin.h \
|
||||||
buffer2array.h \
|
buffer2array.h \
|
||||||
command.h \
|
command.h \
|
||||||
@ -146,6 +147,7 @@ mpd_SOURCES = \
|
|||||||
output_control.c \
|
output_control.c \
|
||||||
output_state.c \
|
output_state.c \
|
||||||
output_print.c \
|
output_print.c \
|
||||||
|
output_command.c \
|
||||||
output_init.c \
|
output_init.c \
|
||||||
output/null_plugin.c \
|
output/null_plugin.c \
|
||||||
buffer2array.c \
|
buffer2array.c \
|
||||||
|
35
src/audio.c
35
src/audio.c
@ -19,12 +19,8 @@
|
|||||||
#include "audio.h"
|
#include "audio.h"
|
||||||
#include "audio_format.h"
|
#include "audio_format.h"
|
||||||
#include "audio_parser.h"
|
#include "audio_parser.h"
|
||||||
#include "output_api.h"
|
|
||||||
#include "output_control.h"
|
|
||||||
#include "output_internal.h"
|
#include "output_internal.h"
|
||||||
#include "output_all.h"
|
#include "output_all.h"
|
||||||
#include "path.h"
|
|
||||||
#include "idle.h"
|
|
||||||
#include "mixer_api.h"
|
#include "mixer_api.h"
|
||||||
|
|
||||||
#include <glib.h>
|
#include <glib.h>
|
||||||
@ -63,37 +59,6 @@ void finishAudioConfig(void)
|
|||||||
audio_format_clear(&configured_audio_format);
|
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)
|
bool mixer_control_setvol(unsigned int device, int volume, int rel)
|
||||||
{
|
{
|
||||||
struct audio_output *output;
|
struct audio_output *output;
|
||||||
|
@ -31,12 +31,6 @@ void initAudioConfig(void);
|
|||||||
|
|
||||||
void finishAudioConfig(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_setvol(unsigned int device, int volume, int rel);
|
||||||
bool mixer_control_getvol(unsigned int device, int *volume);
|
bool mixer_control_getvol(unsigned int device, int *volume);
|
||||||
|
|
||||||
|
@ -34,7 +34,7 @@
|
|||||||
#include "log.h"
|
#include "log.h"
|
||||||
#include "stored_playlist.h"
|
#include "stored_playlist.h"
|
||||||
#include "ack.h"
|
#include "ack.h"
|
||||||
#include "audio.h"
|
#include "output_command.h"
|
||||||
#include "output_print.h"
|
#include "output_print.h"
|
||||||
#include "locate.h"
|
#include "locate.h"
|
||||||
#include "dbUtils.h"
|
#include "dbUtils.h"
|
||||||
@ -1306,34 +1306,38 @@ static enum command_return
|
|||||||
handle_enableoutput(struct client *client, G_GNUC_UNUSED int argc, char *argv[])
|
handle_enableoutput(struct client *client, G_GNUC_UNUSED int argc, char *argv[])
|
||||||
{
|
{
|
||||||
unsigned device;
|
unsigned device;
|
||||||
int ret;
|
bool ret;
|
||||||
|
|
||||||
if (!check_unsigned(client, &device, argv[1]))
|
if (!check_unsigned(client, &device, argv[1]))
|
||||||
return COMMAND_RETURN_ERROR;
|
return COMMAND_RETURN_ERROR;
|
||||||
|
|
||||||
ret = enableAudioDevice(device);
|
ret = audio_output_enable_index(device);
|
||||||
if (ret == -1)
|
if (!ret) {
|
||||||
command_error(client, ACK_ERROR_NO_EXIST,
|
command_error(client, ACK_ERROR_NO_EXIST,
|
||||||
"No such audio output");
|
"No such audio output");
|
||||||
|
return COMMAND_RETURN_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
return ret;
|
return COMMAND_RETURN_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
static enum command_return
|
static enum command_return
|
||||||
handle_disableoutput(struct client *client, G_GNUC_UNUSED int argc, char *argv[])
|
handle_disableoutput(struct client *client, G_GNUC_UNUSED int argc, char *argv[])
|
||||||
{
|
{
|
||||||
unsigned device;
|
unsigned device;
|
||||||
int ret;
|
bool ret;
|
||||||
|
|
||||||
if (!check_unsigned(client, &device, argv[1]))
|
if (!check_unsigned(client, &device, argv[1]))
|
||||||
return COMMAND_RETURN_ERROR;
|
return COMMAND_RETURN_ERROR;
|
||||||
|
|
||||||
ret = disableAudioDevice(device);
|
ret = audio_output_disable_index(device);
|
||||||
if (ret == -1)
|
if (!ret) {
|
||||||
command_error(client, ACK_ERROR_NO_EXIST,
|
command_error(client, ACK_ERROR_NO_EXIST,
|
||||||
"No such audio output");
|
"No such audio output");
|
||||||
|
return COMMAND_RETURN_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
return ret;
|
return COMMAND_RETURN_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
static enum command_return
|
static enum command_return
|
||||||
|
62
src/output_command.c
Normal file
62
src/output_command.c
Normal file
@ -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;
|
||||||
|
}
|
45
src/output_command.h
Normal file
45
src/output_command.h
Normal file
@ -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
Block a user