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
85115798
Commit
85115798
authored
Dec 21, 2008
by
Led
Browse files
Options
Browse Files
Download
Plain Diff
Merge commit '0.14-alpha3' into alt
parents
cd6cf8d0
1a029af0
Show whitespace changes
Inline
Side-by-side
Showing
8 changed files
with
163 additions
and
114 deletions
+163
-114
configure
configure
+10
-10
configure.ac
configure.ac
+1
-1
mp3_plugin.c
src/decoder/mp3_plugin.c
+3
-5
wavpack_plugin.c
src/decoder/wavpack_plugin.c
+119
-82
decoder_api.c
src/decoder_api.c
+3
-0
log.c
src/log.c
+3
-0
player_thread.c
src/player_thread.c
+6
-0
volume.c
src/volume.c
+18
-16
No files found.
configure
View file @
85115798
#! /bin/sh
# Guess values for system-dependent variables and create Makefiles.
# Generated by GNU Autoconf 2.63 for mpd 0.14~alpha
2
.
# Generated by GNU Autoconf 2.63 for mpd 0.14~alpha
3
.
#
# Report bugs to <musicpd-dev-team@lists.sourceforge.net>.
#
...
...
@@ -596,8 +596,8 @@ SHELL=${CONFIG_SHELL-/bin/sh}
# Identity of this package.
PACKAGE_NAME
=
'mpd'
PACKAGE_TARNAME
=
'mpd'
PACKAGE_VERSION
=
'0.14~alpha
2
'
PACKAGE_STRING
=
'mpd 0.14~alpha
2
'
PACKAGE_VERSION
=
'0.14~alpha
3
'
PACKAGE_STRING
=
'mpd 0.14~alpha
3
'
PACKAGE_BUGREPORT
=
'musicpd-dev-team@lists.sourceforge.net'
ac_unique_file
=
"src/main.c"
...
...
@@ -1478,7 +1478,7 @@ if test "$ac_init_help" = "long"; then
# Omit some internal or obsolete options to make the list less imposing.
# This message is too long to be a string in the A/UX 3.1 sh.
cat
<<
_ACEOF
\`configure' configures mpd 0.14~alpha
2
to adapt to many kinds of systems.
\`configure' configures mpd 0.14~alpha
3
to adapt to many kinds of systems.
Usage:
$0
[OPTION]... [VAR=VALUE]...
...
...
@@ -1548,7 +1548,7 @@ fi
if
test
-n
"
$ac_init_help
"
;
then
case
$ac_init_help
in
short
|
recursive
)
echo
"Configuration of mpd 0.14~alpha
2
:"
;;
short
|
recursive
)
echo
"Configuration of mpd 0.14~alpha
3
:"
;;
esac
cat
<<
\
_ACEOF
...
...
@@ -1746,7 +1746,7 @@ fi
test
-n
"
$ac_init_help
"
&&
exit
$ac_status
if
$ac_init_version
;
then
cat
<<
\
_ACEOF
mpd configure 0.14~alpha
2
mpd configure 0.14~alpha
3
generated by GNU Autoconf 2.63
Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001,
...
...
@@ -1760,7 +1760,7 @@ cat >config.log <<_ACEOF
This file contains any messages produced by compilers while
running configure, to aid debugging if configure makes a mistake.
It was created by mpd
$as_me
0.14~alpha
2
, which was
It was created by mpd
$as_me
0.14~alpha
3
, which was
generated by GNU Autoconf 2.63. Invocation command line was
$ $0
$@
...
...
@@ -2457,7 +2457,7 @@ fi
# Define the identity of the package.
PACKAGE
=
'mpd'
VERSION
=
'0.14~alpha
2
'
VERSION
=
'0.14~alpha
3
'
cat
>>
confdefs.h
<<
_ACEOF
...
...
@@ -12937,7 +12937,7 @@ exec 6>&1
# report actual input values of CONFIG_FILES etc. instead of their
# values after options handling.
ac_log="
This file was extended by mpd
$as_me
0.14~alpha
2
, which was
This file was extended by mpd
$as_me
0.14~alpha
3
, which was
generated by GNU Autoconf 2.63. Invocation command line was
CONFIG_FILES =
$CONFIG_FILES
...
...
@@ -13000,7 +13000,7 @@ Report bugs to <bug-autoconf@gnu.org>."
_ACEOF
cat
>>
$CONFIG_STATUS
<<
_ACEOF
|| ac_write_fail=1
ac_cs_version="\\
mpd config.status 0.14~alpha
2
mpd config.status 0.14~alpha
3
configured by
$0
, generated by GNU Autoconf 2.63,
with options \\"`
$as_echo
"
$ac_configure_args
" | sed 's/^ //; s/[\\""\`\
$]
/\\\\&/g'`\\"
...
...
configure.ac
View file @
85115798
AC_PREREQ(2.60)
AC_INIT(mpd, 0.14~alpha
2
, musicpd-dev-team@lists.sourceforge.net)
AC_INIT(mpd, 0.14~alpha
3
, musicpd-dev-team@lists.sourceforge.net)
AC_CONFIG_SRCDIR([src/main.c])
AM_INIT_AUTOMAKE([foreign 1.9 dist-bzip2])
AM_CONFIG_HEADER(config.h)
...
...
src/decoder/mp3_plugin.c
View file @
85115798
...
...
@@ -994,10 +994,7 @@ mp3_read(struct mp3_data *data, struct replay_gain_info **replay_gain_info_r)
cmd
=
mp3_synth_and_send
(
data
,
replay_gain_info_r
!=
NULL
?
*
replay_gain_info_r
:
NULL
);
if
(
cmd
!=
DECODE_COMMAND_NONE
)
return
false
;
if
(
decoder_get_command
(
decoder
)
==
DECODE_COMMAND_SEEK
)
{
if
(
cmd
==
DECODE_COMMAND_SEEK
)
{
unsigned
long
j
;
assert
(
data
->
input_stream
->
seekable
);
...
...
@@ -1015,7 +1012,8 @@ mp3_read(struct mp3_data *data, struct replay_gain_info **replay_gain_info_r)
data
->
mute_frame
=
MUTEFRAME_SEEK
;
decoder_command_finished
(
decoder
);
}
}
}
else
if
(
cmd
!=
DECODE_COMMAND_NONE
)
return
false
;
}
while
(
true
)
{
...
...
src/decoder/wavpack_plugin.c
View file @
85115798
...
...
@@ -46,13 +46,19 @@ static struct {
{
"disc"
,
TAG_ITEM_DISC
},
};
/** A pointer type for format converter function. */
typedef
void
(
*
format_samples_t
)(
int
bytes_per_sample
,
void
*
buffer
,
uint32_t
count
);
/*
* This function has been borrowed from the tiny player found on
* wavpack.com. Modifications were required because mpd only handles
* max 24-bit samples.
*/
static
void
format_samples_int
(
int
bytes_per_sample
,
void
*
buffer
,
uint32_t
samc
nt
)
format_samples_int
(
int
bytes_per_sample
,
void
*
buffer
,
uint32_t
cou
nt
)
{
int32_t
*
src
=
buffer
;
...
...
@@ -68,7 +74,7 @@ format_samples_int(int bytes_per_sample, void *buffer, uint32_t samcnt)
assert
(
sizeof
(
uchar
)
<=
sizeof
(
uint32_t
));
/* pass through and align 8-bit samples */
while
(
samc
nt
--
)
{
while
(
cou
nt
--
)
{
*
dst
++
=
*
src
++
;
}
break
;
...
...
@@ -78,7 +84,7 @@ format_samples_int(int bytes_per_sample, void *buffer, uint32_t samcnt)
assert
(
sizeof
(
uint16_t
)
<=
sizeof
(
uint32_t
));
/* pass through and align 16-bit samples */
while
(
samc
nt
--
)
{
while
(
cou
nt
--
)
{
*
dst
++
=
*
src
++
;
}
break
;
...
...
@@ -91,7 +97,7 @@ format_samples_int(int bytes_per_sample, void *buffer, uint32_t samcnt)
assert
(
sizeof
(
uint32_t
)
<=
sizeof
(
uint32_t
));
/* downsample to 24-bit */
while
(
samc
nt
--
)
{
while
(
cou
nt
--
)
{
*
dst
++
=
*
src
++
>>
8
;
}
break
;
...
...
@@ -104,13 +110,13 @@ format_samples_int(int bytes_per_sample, void *buffer, uint32_t samcnt)
*/
static
void
format_samples_float
(
mpd_unused
int
bytes_per_sample
,
void
*
buffer
,
uint32_t
samc
nt
)
uint32_t
cou
nt
)
{
int32_t
*
dst
=
buffer
;
float
*
src
=
buffer
;
assert
(
sizeof
(
int32_t
)
<=
sizeof
(
float
));
while
(
samc
nt
--
)
{
while
(
cou
nt
--
)
{
*
dst
++
=
(
int32_t
)(
*
src
++
+
0
.
5
f
);
}
}
...
...
@@ -120,18 +126,16 @@ format_samples_float(mpd_unused int bytes_per_sample, void *buffer,
* Requires an already opened WavpackContext.
*/
static
void
wavpack_decode
(
struct
decoder
*
decoder
,
WavpackContext
*
wpc
,
bool
can
seek
,
struct
replay_gain_info
*
replay
GainI
nfo
)
wavpack_decode
(
struct
decoder
*
decoder
,
WavpackContext
*
wpc
,
bool
can_
seek
,
struct
replay_gain_info
*
replay
_gain_i
nfo
)
{
struct
audio_format
audio_format
;
void
(
*
format_samples
)(
int
bytes_per_sample
,
void
*
buffer
,
uint32_t
samcnt
);
format_samples_t
format_samples
;
char
chunk
[
CHUNK_SIZE
];
float
file_time
;
int
samplesreq
,
samplesgot
;
int
allsamples
;
int
position
,
outsamplesize
;
int
bytes_per_sample
;
int
samples_requested
,
samples_got
;
float
total_time
,
current_time
;
int
bytes_per_sample
,
output_sample_size
;
int
position
;
audio_format
.
sample_rate
=
WavpackGetSampleRate
(
wpc
);
audio_format
.
channels
=
WavpackGetReducedChannels
(
wpc
);
...
...
@@ -150,26 +154,30 @@ wavpack_decode(struct decoder * decoder, WavpackContext *wpc, bool canseek,
format_samples
=
format_samples_int
;
}
allsamples
=
WavpackGetNumSamples
(
wpc
);
total_time
=
WavpackGetNumSamples
(
wpc
);
total_time
/=
audio_format
.
sample_rate
;
bytes_per_sample
=
WavpackGetBytesPerSample
(
wpc
);
outsamplesize
=
audio_format_frame_size
(
&
audio_format
);
output_sample_size
=
bytes_per_sample
;
if
(
output_sample_size
==
3
)
{
output_sample_size
=
4
;
}
output_sample_size
*=
audio_format
.
channels
;
/* wavpack gives us all kind of samples in a 32-bit space */
samples
req
=
sizeof
(
chunk
)
/
(
4
*
audio_format
.
channels
);
samples
_requested
=
sizeof
(
chunk
)
/
(
4
*
audio_format
.
channels
);
decoder_initialized
(
decoder
,
&
audio_format
,
canseek
,
(
float
)
allsamples
/
audio_format
.
sample_rate
);
decoder_initialized
(
decoder
,
&
audio_format
,
can_seek
,
total_time
);
position
=
0
;
do
{
if
(
decoder_get_command
(
decoder
)
==
DECODE_COMMAND_SEEK
)
{
if
(
canseek
)
{
if
(
can
_
seek
)
{
int
where
;
where
=
decoder_seek_where
(
decoder
)
*
audio_format
.
sample_rate
;
where
=
decoder_seek_where
(
decoder
)
;
where
*=
audio_format
.
sample_rate
;
if
(
WavpackSeekSample
(
wpc
,
where
))
{
position
=
where
;
decoder_command_finished
(
decoder
);
...
...
@@ -185,23 +193,29 @@ wavpack_decode(struct decoder * decoder, WavpackContext *wpc, bool canseek,
break
;
}
samplesgot
=
WavpackUnpackSamples
(
wpc
,
(
int32_t
*
)
chunk
,
samplesreq
);
if
(
samplesgot
>
0
)
{
samples_got
=
WavpackUnpackSamples
(
wpc
,
(
int32_t
*
)
chunk
,
samples_requested
);
if
(
samples_got
>
0
)
{
int
bitrate
=
(
int
)(
WavpackGetInstantBitrate
(
wpc
)
/
1000
+
0
.
5
);
position
+=
samplesgot
;
file_time
=
(
float
)
position
/
audio_format
.
sample_rate
;
format_samples
(
bytes_per_sample
,
chunk
,
samplesgot
*
audio_format
.
channels
);
decoder_data
(
decoder
,
NULL
,
chunk
,
samplesgot
*
outsamplesize
,
file_time
,
bitrate
,
replayGainInfo
);
}
}
while
(
samplesgot
==
samplesreq
);
position
+=
samples_got
;
current_time
=
position
;
current_time
/=
audio_format
.
sample_rate
;
format_samples
(
bytes_per_sample
,
chunk
,
samples_got
*
audio_format
.
channels
);
decoder_data
(
decoder
,
NULL
,
chunk
,
samples_got
*
output_sample_size
,
current_time
,
bitrate
,
replay_gain_info
);
}
}
while
(
samples_got
>
0
);
}
/**
...
...
@@ -230,17 +244,22 @@ wavpack_replaygain(WavpackContext *wpc)
replay_gain_info
=
replay_gain_info_new
();
found
=
wavpack_tag_float
(
wpc
,
"replaygain_track_gain"
,
&
replay_gain_info
->
tuples
[
REPLAY_GAIN_TRACK
].
gain
)
||
wavpack_tag_float
(
wpc
,
"replaygain_track_peak"
,
&
replay_gain_info
->
tuples
[
REPLAY_GAIN_TRACK
].
peak
)
||
wavpack_tag_float
(
wpc
,
"replaygain_album_gain"
,
&
replay_gain_info
->
tuples
[
REPLAY_GAIN_ALBUM
].
gain
)
||
wavpack_tag_float
(
wpc
,
"replaygain_album_peak"
,
&
replay_gain_info
->
tuples
[
REPLAY_GAIN_ALBUM
].
peak
);
found
|=
wavpack_tag_float
(
wpc
,
"replaygain_track_gain"
,
&
replay_gain_info
->
tuples
[
REPLAY_GAIN_TRACK
].
gain
);
found
|=
wavpack_tag_float
(
wpc
,
"replaygain_track_peak"
,
&
replay_gain_info
->
tuples
[
REPLAY_GAIN_TRACK
].
peak
);
found
|=
wavpack_tag_float
(
wpc
,
"replaygain_album_gain"
,
&
replay_gain_info
->
tuples
[
REPLAY_GAIN_ALBUM
].
gain
);
found
|=
wavpack_tag_float
(
wpc
,
"replaygain_album_peak"
,
&
replay_gain_info
->
tuples
[
REPLAY_GAIN_ALBUM
].
peak
);
if
(
found
)
{
return
replay_gain_info
;
...
...
@@ -261,38 +280,39 @@ wavpack_tagdup(const char *fname)
struct
tag
*
tag
;
char
error
[
ERRORLEN
];
char
*
s
;
int
ssize
;
int
j
;
int
size
,
allocated_size
;
wpc
=
WavpackOpenFileInput
(
fname
,
error
,
OPEN_TAGS
,
0
);
if
(
wpc
==
NULL
)
{
g_warning
(
"failed to open WavPack file
\"
%s
\"
: %s
\n
"
,
fname
,
error
);
g_warning
(
"failed to open WavPack file
\"
%s
\"
: %s
\n
"
,
fname
,
error
);
return
NULL
;
}
tag
=
tag_new
();
tag
->
time
=
(
float
)
WavpackGetNumSamples
(
wpc
)
/
WavpackGetSampleRate
(
wpc
);
tag
->
time
=
WavpackGetNumSamples
(
wpc
);
tag
->
time
/=
WavpackGetSampleRate
(
wpc
);
s
size
=
0
;
allocated_
size
=
0
;
s
=
NULL
;
for
(
unsigned
i
=
0
;
i
<
G_N_ELEMENTS
(
tagtypes
);
++
i
)
{
j
=
WavpackGetTagItem
(
wpc
,
tagtypes
[
i
].
name
,
NULL
,
0
);
if
(
j
>
0
)
{
++
j
;
size
=
WavpackGetTagItem
(
wpc
,
tagtypes
[
i
].
name
,
NULL
,
0
);
if
(
size
>
0
)
{
++
size
;
/* EOS */
if
(
s
==
NULL
)
{
s
=
g_malloc
(
j
);
ssize
=
j
;
}
else
if
(
j
>
s
size
)
{
char
*
t
=
(
char
*
)
g_realloc
(
s
,
j
);
ssize
=
j
;
s
=
g_malloc
(
size
);
allocated_size
=
size
;
}
else
if
(
size
>
allocated_
size
)
{
char
*
t
=
(
char
*
)
g_realloc
(
s
,
size
);
allocated_size
=
size
;
s
=
t
;
}
WavpackGetTagItem
(
wpc
,
tagtypes
[
i
].
name
,
s
,
j
);
WavpackGetTagItem
(
wpc
,
tagtypes
[
i
].
name
,
s
,
size
);
tag_add_item
(
tag
,
tagtypes
[
i
].
type
,
s
);
}
}
...
...
@@ -342,8 +362,9 @@ wavpack_input_read_bytes(void *id, void *data, int32_t bcount)
/* wavpack fails if we return a partial read, so we just wait
until the buffer is full */
while
(
bcount
>
0
)
{
size_t
nbytes
=
decoder_read
(
wpin
(
id
)
->
decoder
,
wpin
(
id
)
->
is
,
buf
,
bcount
);
size_t
nbytes
=
decoder_read
(
wpin
(
id
)
->
decoder
,
wpin
(
id
)
->
is
,
buf
,
bcount
);
if
(
nbytes
==
0
)
{
/* EOF, error or a decoder command */
break
;
...
...
@@ -450,8 +471,9 @@ wavpack_open_wvc(struct decoder *decoder, struct input_stream *is_wvc,
* And we try to buffer in order to get know
* about a possible 404 error.
*/
nbytes
=
decoder_read
(
decoder
,
is_wvc
,
&
first_byte
,
sizeof
(
first_byte
));
nbytes
=
decoder_read
(
decoder
,
is_wvc
,
&
first_byte
,
sizeof
(
first_byte
)
);
if
(
nbytes
==
0
)
{
input_stream_close
(
is_wvc
);
return
false
;
...
...
@@ -472,25 +494,30 @@ wavpack_streamdecode(struct decoder * decoder, struct input_stream *is)
char
error
[
ERRORLEN
];
WavpackContext
*
wpc
;
struct
input_stream
is_wvc
;
int
open_flags
=
OPEN_2CH_MAX
|
OPEN_NORMALIZE
/*| OPEN_STREAMING*/
;
int
open_flags
=
OPEN_2CH_MAX
|
OPEN_NORMALIZE
;
struct
wavpack_input
isp
,
isp_wvc
;
bool
canseek
=
is
->
seekable
;
bool
can
_
seek
=
is
->
seekable
;
if
(
wavpack_open_wvc
(
decoder
,
&
is_wvc
,
&
isp_wvc
))
{
open_flags
|=
OPEN_WVC
;
canseek
&=
is_wvc
.
seekable
;
can_seek
&=
is_wvc
.
seekable
;
}
if
(
!
can_seek
)
{
open_flags
|=
OPEN_STREAMING
;
}
wavpack_input_init
(
&
isp
,
decoder
,
is
);
wpc
=
WavpackOpenFileInputEx
(
&
mpd_is_reader
,
&
isp
,
&
isp_wvc
,
error
,
open_flags
,
23
);
wpc
=
WavpackOpenFileInputEx
(
&
mpd_is_reader
,
&
isp
,
&
isp_wvc
,
error
,
open_flags
,
23
);
if
(
wpc
==
NULL
)
{
g_warning
(
"failed to open WavPack stream: %s
\n
"
,
error
);
return
;
}
wavpack_decode
(
decoder
,
wpc
,
canseek
,
NULL
);
wavpack_decode
(
decoder
,
wpc
,
can
_
seek
,
NULL
);
WavpackCloseFile
(
wpc
);
if
(
open_flags
&
OPEN_WVC
)
{
...
...
@@ -508,12 +535,15 @@ wavpack_filedecode(struct decoder *decoder, const char *fname)
WavpackContext
*
wpc
;
struct
replay_gain_info
*
replay_gain_info
;
wpc
=
WavpackOpenFileInput
(
fname
,
error
,
OPEN_TAGS
|
OPEN_WVC
|
OPEN_2CH_MAX
|
OPEN_NORMALIZE
,
23
);
wpc
=
WavpackOpenFileInput
(
fname
,
error
,
OPEN_TAGS
|
OPEN_WVC
|
OPEN_2CH_MAX
|
OPEN_NORMALIZE
,
23
);
if
(
wpc
==
NULL
)
{
g_warning
(
"failed to open WavPack file
\"
%s
\"
: %s
\n
"
,
fname
,
error
);
g_warning
(
"failed to open WavPack file
\"
%s
\"
: %s
\n
"
,
fname
,
error
);
return
;
}
...
...
@@ -528,8 +558,15 @@ wavpack_filedecode(struct decoder *decoder, const char *fname)
WavpackCloseFile
(
wpc
);
}
static
char
const
*
const
wavpack_suffixes
[]
=
{
"wv"
,
NULL
};
static
char
const
*
const
wavpack_mime_types
[]
=
{
"audio/x-wavpack"
,
NULL
};
static
char
const
*
const
wavpack_suffixes
[]
=
{
"wv"
,
NULL
};
static
char
const
*
const
wavpack_mime_types
[]
=
{
"audio/x-wavpack"
,
NULL
};
const
struct
decoder_plugin
wavpack_plugin
=
{
.
name
=
"wavpack"
,
...
...
src/decoder_api.c
View file @
85115798
...
...
@@ -168,6 +168,9 @@ need_chunks(struct input_stream *is, bool wait)
if
((
is
==
NULL
||
input_stream_buffer
(
is
)
<=
0
)
&&
wait
)
{
notify_wait
(
&
dc
.
notify
);
notify_signal
(
&
pc
.
notify
);
if
(
dc
.
command
!=
DECODE_COMMAND_STOP
)
return
dc
.
command
;
}
return
DECODE_COMMAND_NONE
;
...
...
src/log.c
View file @
85115798
...
...
@@ -75,6 +75,9 @@ mpd_log_func(G_GNUC_UNUSED const gchar *log_domain,
?
stderr
:
stdout
;
char
*
converted
;
if
(
log_level
>
(
int
)
log_threshold
)
return
;
if
(
log_charset
!=
NULL
)
{
converted
=
g_convert_with_fallback
(
message
,
-
1
,
log_charset
,
"utf-8"
,
...
...
src/player_thread.c
View file @
85115798
...
...
@@ -153,6 +153,9 @@ static void player_process_command(struct player *player)
case
PLAYER_COMMAND_QUEUE
:
assert
(
pc
.
next_song
!=
NULL
);
assert
(
!
player
->
queued
);
assert
(
player
->
next_song_chunk
==
-
1
);
player
->
queued
=
true
;
player_command_finished
();
break
;
...
...
@@ -352,10 +355,12 @@ static void do_play(void)
#endif
if
(
decoder_is_idle
()
&&
!
player
.
queued
&&
player
.
next_song_chunk
<
0
&&
pc
.
next_song
!=
NULL
&&
pc
.
command
==
PLAYER_COMMAND_NONE
)
{
/* the decoder has finished the current song;
request the next song from the playlist */
pc
.
next_song
=
NULL
;
wakeup_main_task
();
}
...
...
@@ -429,6 +434,7 @@ static void do_play(void)
/* wait for the
decoder */
music_pipe_set_lazy
(
false
);
notify_signal
(
&
dc
.
notify
);
notify_wait
(
&
pc
.
notify
);
continue
;
}
...
...
src/volume.c
View file @
85115798
...
...
@@ -79,14 +79,28 @@ static int volume_alsaSet = -1;
#ifdef HAVE_OSS
#include <alloca.h>
/* only alloca user in mpd atm, may change ... */
static
void
closeOssMixer
(
void
)
{
while
(
close
(
volume_ossFd
)
&&
errno
==
EINTR
)
;
volume_ossFd
=
-
1
;
}
static
int
oss_find_mixer
(
const
char
*
name
)
{
const
char
*
labels
[
SOUND_MIXER_NRDEVICES
]
=
SOUND_DEVICE_LABELS
;
size_t
name_length
=
strlen
(
name
);
for
(
unsigned
i
=
0
;
i
<
SOUND_MIXER_NRDEVICES
;
i
++
)
{
if
(
strncasecmp
(
name
,
labels
[
i
],
name_length
)
==
0
&&
(
labels
[
i
][
name_length
]
==
0
||
labels
[
i
][
name_length
]
==
' '
))
return
i
;
}
return
-
1
;
}
static
int
prepOssMixer
(
const
char
*
device
)
{
ConfigParam
*
param
;
...
...
@@ -97,7 +111,6 @@ static int prepOssMixer(const char *device)
}
if
((
param
=
getConfigParam
(
CONF_MIXER_CONTROL
)))
{
const
char
*
labels
[
SOUND_MIXER_NRDEVICES
]
=
SOUND_DEVICE_LABELS
;
int
i
;
int
devmask
=
0
;
...
...
@@ -107,20 +120,9 @@ static int prepOssMixer(const char *device)
return
-
1
;
}
for
(
i
=
0
;
i
<
SOUND_MIXER_NRDEVICES
;
i
++
)
{
ssize_t
len
=
strlen
(
labels
[
i
]);
char
*
duplicated
=
alloca
(
len
+
1
);
/* eliminate spaces at the end */
memcpy
(
duplicated
,
labels
[
i
],
len
+
1
);
len
-=
2
;
while
(
len
>=
0
&&
duplicated
[
len
]
==
' '
)
duplicated
[
len
--
]
=
'\0'
;
if
(
strcasecmp
(
duplicated
,
param
->
value
)
==
0
)
break
;
}
i
=
oss_find_mixer
(
param
->
value
);
if
(
i
>=
SOUND_MIXER_NRDEVICES
)
{
if
(
i
<
0
)
{
WARNING
(
"mixer control
\"
%s
\"
not found at line %i
\n
"
,
param
->
value
,
param
->
line
);
closeOssMixer
();
...
...
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