Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
M
mpd
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Registry
Registry
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Иван Мажукин
mpd
Commits
c4d1344f
Commit
c4d1344f
authored
Jul 22, 2006
by
J. Alexander Treuman
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Adding fifo output plugin
git-svn-id:
https://svn.musicpd.org/mpd/trunk@4423
09075e82-0dd4-0310-85a5-a0d7c8717e4f
parent
c379533b
Hide whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
279 additions
and
0 deletions
+279
-0
configure.ac
configure.ac
+14
-0
mpd.conf.5
doc/mpd.conf.5
+11
-0
Makefile.am
src/Makefile.am
+1
-0
audio.c
src/audio.c
+2
-0
audioOutput_fifo.c
src/audioOutputs/audioOutput_fifo.c
+251
-0
No files found.
configure.ac
View file @
c4d1344f
...
...
@@ -67,6 +67,7 @@ AC_ARG_ENABLE(sun,[ --disable-sun disable sun support (default: enable)],[e
AC_ARG_ENABLE(oss,[ --disable-oss disable OSS support (default: enable)],[enable_oss=$enableval],[enable_oss=yes])
AC_ARG_ENABLE(alsa,[ --disable-alsa disable ALSA support (default: enable)],[enable_alsa=$enableval],[enable_alsa=yes])
AC_ARG_ENABLE(pulse,[ --disable-pulse disable support for the PulseAudio sound server (default: enable)],[enable_pulse=$enableval],[enable_pulse=yes])
AC_ARG_ENABLE(fifo,[ --enable-fifo enable support for writing audio to a FIFO (default: disable)],[enable_fifo=$enableval],[enable_fifo=no])
AC_ARG_ENABLE(mvp,[ --enable-mvp enable support for Hauppauge Media MVP (default: disable)],[enable_mvp=$enableval],[enable_mvp=no])
AC_ARG_ENABLE(oggvorbis,[ --disable-oggvorbis disable Ogg Vorbis support (default: enable)],[enable_oggvorbis=$enableval],enable_oggvorbis=yes)
AC_ARG_ENABLE(oggflac,[ --disable-oggflac disable OggFLAC support (default: enable)],[enable_oggflac=$enableval],enable_oggflac=yes)
...
...
@@ -176,6 +177,12 @@ if test x$enable_pulse = xyes; then
[enable_pulse=no;AC_MSG_WARN([PulseAudio not found -- disabling])])
fi
if test x$enable_fifo = xyes; then
AC_CHECK_FUNC([mkfifo],
[enable_fifo=yes;AC_DEFINE([HAVE_FIFO], 1, [Define to enable support for writing audio to a FIFO])],
[enable_fifo=no;AC_MSG_WARN([mkfifo not found -- disabling support for writing audio to a FIFO])])
fi
if test x$enable_mvp = xyes; then
AC_DEFINE(HAVE_MVP,1,[Define to enable Hauppauge Media MVP support])
fi
...
...
@@ -672,6 +679,12 @@ else
echo " PulseAudio support ............disabled"
fi
if test x$enable_fifo = xyes; then
echo " FIFO support ..................enabled"
else
echo " FIFO support ..................disabled"
fi
if test x$enable_mvp = xyes; then
echo " Media MVP support .............enabled"
else
...
...
@@ -693,6 +706,7 @@ if test x$enable_ao = xno &&
test x$enable_alsa = xno &&
test x$enable_osx = xno &&
test x$enable_pulse = xno &&
test x$enable_fifo = xno &&
test x$enable_mvp = xno; then
AC_MSG_ERROR("No Audio Output types configured!")
fi
...
...
doc/mpd.conf.5
View file @
c4d1344f
...
...
@@ -254,6 +254,17 @@ default is "".
This specifies how many bytes to write to the audio device at once. This
parameter is to work around a bug in older versions of libao on sound cards
with very small buffers. The default is 1024.
.SH REQUIRED FIFO OUTPUT PARAMETERS
.TP
.B path <path>
This specifies the path of the FIFO to output to. Must be an absolute path.
If the path does not exist it will be created when mpd is started, and removed
when mpd is stopped. The FIFO will be created with the same user and group as
mpd is running as. Default permissions can be modified by using the builtin
shell command "umask". If a FIFO already exists at the specified path it will
be reused, and will \fBnot\fP be removed when mpd is stopped. You can use the
"mkfifo" command to create this, and then you may modify the permissions to
your liking.
.SH REQUIRED SHOUT OUTPUT PARAMETERS
.TP
.B name <name>
...
...
src/Makefile.am
View file @
c4d1344f
...
...
@@ -6,6 +6,7 @@ mpd_audioOutputs = \
audioOutputs/audioOutput_oss.c
\
audioOutputs/audioOutput_osx.c
\
audioOutputs/audioOutput_pulse.c
\
audioOutputs/audioOutput_fifo.c
\
audioOutputs/audioOutput_mvp.c
\
audioOutputs/audioOutput_shout.c
...
...
src/audio.c
View file @
c4d1344f
...
...
@@ -77,6 +77,7 @@ extern AudioOutputPlugin aoPlugin;
extern
AudioOutputPlugin
ossPlugin
;
extern
AudioOutputPlugin
osxPlugin
;
extern
AudioOutputPlugin
pulsePlugin
;
extern
AudioOutputPlugin
fifoPlugin
;
extern
AudioOutputPlugin
mvpPlugin
;
extern
AudioOutputPlugin
shoutPlugin
;
...
...
@@ -88,6 +89,7 @@ void loadAudioDrivers(void)
loadAudioOutputPlugin
(
&
ossPlugin
);
loadAudioOutputPlugin
(
&
osxPlugin
);
loadAudioOutputPlugin
(
&
pulsePlugin
);
loadAudioOutputPlugin
(
&
fifoPlugin
);
loadAudioOutputPlugin
(
&
mvpPlugin
);
loadAudioOutputPlugin
(
&
shoutPlugin
);
}
...
...
src/audioOutputs/audioOutput_fifo.c
0 → 100644
View file @
c4d1344f
/* the Music Player Daemon (MPD)
* (c)2003-2006 by Warren Dukes (warren.dukes@gmail.com)
* This project's homepage is: 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
*/
#include "../audioOutput.h"
#include <stdlib.h>
#ifdef HAVE_FIFO
#include "../conf.h"
#include "../log.h"
#include <errno.h>
#include <fcntl.h>
#include <string.h>
#include <unistd.h>
#include <sys/stat.h>
#define FIFO_BUFFER_SIZE 65536
/* pipe capacity on Linux >= 2.6.11 */
typedef
struct
_FifoData
{
char
*
path
;
int
input
;
int
output
;
int
created
;
}
FifoData
;
static
FifoData
*
newFifoData
()
{
FifoData
*
ret
;
ret
=
malloc
(
sizeof
(
FifoData
));
ret
->
path
=
NULL
;
ret
->
input
=
-
1
;
ret
->
output
=
-
1
;
ret
->
created
=
0
;
return
ret
;
}
static
void
freeFifoData
(
FifoData
*
fd
)
{
if
(
fd
->
path
)
free
(
fd
->
path
);
free
(
fd
);
}
static
int
makeFifo
(
FifoData
*
fd
)
{
if
(
mkfifo
(
fd
->
path
,
0666
)
<
0
)
{
ERROR
(
"Couldn't create FIFO
\"
%s
\"
: %s
\n
"
,
fd
->
path
,
strerror
(
errno
));
return
-
1
;
}
fd
->
created
=
1
;
return
0
;
}
static
int
checkFifo
(
FifoData
*
fd
)
{
struct
stat
info
;
if
(
stat
(
fd
->
path
,
&
info
)
<
0
)
{
if
(
errno
==
ENOENT
)
{
/* Path doesn't exist */
return
makeFifo
(
fd
);
}
ERROR
(
"Failed to stat FIFO
\"
%s
\"
: %s
\n
"
,
fd
->
path
,
strerror
(
errno
));
return
-
1
;
}
if
(
!
S_ISFIFO
(
info
.
st_mode
))
{
ERROR
(
"
\"
%s
\"
already exists, but is not a FIFO
\n
"
,
fd
->
path
);
return
-
1
;
}
return
0
;
}
static
int
openFifo
(
FifoData
*
fd
)
{
if
(
checkFifo
(
fd
)
<
0
)
return
-
1
;
fd
->
input
=
open
(
fd
->
path
,
O_RDONLY
|
O_NONBLOCK
);
if
(
fd
->
input
<
0
)
{
ERROR
(
"Could not open FIFO
\"
%s
\"
for reading: %s
\n
"
,
fd
->
path
,
strerror
(
errno
));
return
-
1
;
}
fd
->
output
=
open
(
fd
->
path
,
O_WRONLY
|
O_NONBLOCK
);
if
(
fd
->
output
<
0
)
{
ERROR
(
"Could not open FIFO
\"
%s
\"
for writing: %s
\n
"
,
fd
->
path
,
strerror
(
errno
));
return
-
1
;
}
return
0
;
}
static
void
removeFifo
(
FifoData
*
fd
)
{
DEBUG
(
"Removing FIFO
\"
%s
\"\n
"
,
fd
->
path
);
if
(
unlink
(
fd
->
path
)
<
0
)
{
ERROR
(
"Could not remove FIFO
\"
%s
\"
: %s
\n
"
,
fd
->
path
,
strerror
(
errno
));
return
;
}
fd
->
created
=
0
;
}
static
void
closeFifo
(
FifoData
*
fd
)
{
struct
stat
info
;
if
(
fd
->
input
>=
0
)
close
(
fd
->
input
);
if
(
fd
->
output
>=
0
)
close
(
fd
->
output
);
if
(
fd
->
created
&&
(
stat
(
fd
->
path
,
&
info
)
==
0
))
removeFifo
(
fd
);
}
static
int
fifo_initDriver
(
AudioOutput
*
audioOutput
,
ConfigParam
*
param
)
{
BlockParam
*
path
=
NULL
;
FifoData
*
fd
;
if
(
param
)
path
=
getBlockParam
(
param
,
"path"
);
if
(
!
path
)
{
ERROR
(
"No
\"
path
\"
parameter specified for fifo output "
"defined at line %i
\n
"
,
param
->
line
);
exit
(
EXIT_FAILURE
);
}
if
(
path
->
value
[
0
]
!=
'/'
)
{
ERROR
(
"
\"
path
\"
parameter for fifo output is not an absolute "
"path at line %i
\n
"
,
param
->
line
);
exit
(
EXIT_FAILURE
);
}
fd
=
newFifoData
();
fd
->
path
=
strdup
(
path
->
value
);
audioOutput
->
data
=
fd
;
if
(
openFifo
(
fd
)
<
0
)
{
freeFifoData
(
fd
);
return
-
1
;
}
return
0
;
}
static
void
fifo_finishDriver
(
AudioOutput
*
audioOutput
)
{
FifoData
*
fd
;
fd
=
audioOutput
->
data
;
closeFifo
(
fd
);
freeFifoData
(
fd
);
}
static
int
fifo_openDevice
(
AudioOutput
*
audioOutput
)
{
audioOutput
->
open
=
1
;
return
0
;
}
static
void
fifo_dropBufferedAudio
(
AudioOutput
*
audioOutput
)
{
FifoData
*
fd
;
char
buf
[
FIFO_BUFFER_SIZE
];
int
bytes
=
1
;
fd
=
audioOutput
->
data
;
while
(
bytes
>
0
)
bytes
=
read
(
fd
->
input
,
buf
,
FIFO_BUFFER_SIZE
);
if
(
bytes
<
0
&&
errno
!=
EAGAIN
)
{
WARNING
(
"Flush of FIFO
\"
%s
\"
failed: %s
\n
"
,
fd
->
path
,
strerror
(
errno
));
}
}
static
void
fifo_closeDevice
(
AudioOutput
*
audioOutput
)
{
audioOutput
->
open
=
0
;
}
static
int
fifo_playAudio
(
AudioOutput
*
audioOutput
,
char
*
playChunk
,
int
size
)
{
FifoData
*
fd
;
int
bytes
;
int
offset
=
0
;
fd
=
audioOutput
->
data
;
while
(
1
)
{
bytes
=
write
(
fd
->
output
,
&
playChunk
[
offset
],
size
);
if
(
bytes
<
0
&&
errno
==
EAGAIN
)
{
fifo_dropBufferedAudio
(
audioOutput
);
}
else
if
(
bytes
<
0
)
{
ERROR
(
"Closing FIFO output
\"
%s
\"
due to write error: "
"%s
\n
"
,
fd
->
path
,
strerror
(
errno
));
fifo_closeDevice
(
audioOutput
);
return
-
1
;
}
else
if
(
bytes
<
size
)
{
size
-=
bytes
;
offset
+=
bytes
;
}
else
{
break
;
}
}
return
0
;
}
AudioOutputPlugin
fifoPlugin
=
{
"fifo"
,
NULL
,
/* testDefaultDeviceFunc */
fifo_initDriver
,
fifo_finishDriver
,
fifo_openDevice
,
fifo_playAudio
,
fifo_dropBufferedAudio
,
fifo_closeDevice
,
NULL
,
/* sendMetadataFunc */
};
#else
/* HAVE_FIFO */
DISABLED_AUDIO_OUTPUT_PLUGIN
(
fifoPlugin
)
#endif
/* HAVE_FIFO */
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment