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
3e11a28c
Commit
3e11a28c
authored
Nov 10, 2013
by
Max Kellermann
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
pcm/SoxrResampler: new resampler option using libsoxr
parent
3ed80f31
Hide whitespace changes
Inline
Side-by-side
Showing
7 changed files
with
202 additions
and
0 deletions
+202
-0
Makefile.am
Makefile.am
+7
-0
NEWS
NEWS
+1
-0
configure.ac
configure.ac
+15
-0
user.xml
doc/user.xml
+17
-0
ConfiguredResampler.cxx
src/pcm/ConfiguredResampler.cxx
+20
-0
SoxrResampler.cxx
src/pcm/SoxrResampler.cxx
+95
-0
SoxrResampler.hxx
src/pcm/SoxrResampler.hxx
+47
-0
No files found.
Makefile.am
View file @
3e11a28c
...
...
@@ -347,10 +347,12 @@ libpcm_a_SOURCES = \
src/pcm/PcmPrng.hxx
\
src/pcm/PcmUtils.hxx
libpcm_a_CPPFLAGS
=
$(AM_CPPFLAGS)
\
$(SOXR_CFLAGS)
\
$(SAMPLERATE_CFLAGS)
PCM_LIBS
=
\
libpcm.a
\
$(SOXR_LIBS)
\
$(SAMPLERATE_LIBS)
if
HAVE_LIBSAMPLERATE
...
...
@@ -358,6 +360,11 @@ libpcm_a_SOURCES += \
src/pcm/LibsamplerateResampler.cxx src/pcm/LibsamplerateResampler.hxx
endif
if
HAVE_SOXR
libpcm_a_SOURCES
+=
\
src/pcm/SoxrResampler.cxx src/pcm/SoxrResampler.hxx
endif
# File system library
libfs_a_SOURCES
=
\
...
...
NEWS
View file @
3e11a28c
ver 0.19 (not yet released)
* new resampler option using libsoxr
ver 0.18.5 (2013/11/23)
* configuration
...
...
configure.ac
View file @
3e11a28c
...
...
@@ -360,6 +360,11 @@ AC_ARG_ENABLE(lsr,
[enable libsamplerate support]),,
enable_lsr=auto)
AC_ARG_ENABLE(soxr,
AS_HELP_STRING([--enable-soxr],
[enable the libsoxr resampler]),,
enable_soxr=auto)
AC_ARG_ENABLE(mad,
AS_HELP_STRING([--enable-mad],
[enable libmad mp3 decoder plugin]),,
...
...
@@ -765,6 +770,15 @@ if test x$enable_lsr = xyes; then
fi
AM_CONDITIONAL(HAVE_LIBSAMPLERATE, test x$enable_lsr = xyes)
dnl ------------------------------ libsoxr ------------------------------------
MPD_AUTO_PKG(soxr, SOXR, [soxr],
[libsoxr resampler], [libsoxr not found])
if test x$enable_soxr = xyes; then
AC_DEFINE([HAVE_SOXR], 1, [Define to enable libsoxr])
fi
AM_CONDITIONAL(HAVE_SOXR, test x$enable_soxr = xyes)
dnl ---------------------------------------------------------------------------
dnl Input Plugins
dnl ---------------------------------------------------------------------------
...
...
@@ -1626,6 +1640,7 @@ results(wildmidi, [WildMidi])
printf '\nOther features:\n\t'
results(lsr, [libsamplerate])
results(soxr, [libsoxr])
results(libmpdclient, [libmpdclient])
results(inotify, [inotify])
results(sqlite, [SQLite])
...
...
doc/user.xml
View file @
3e11a28c
...
...
@@ -655,6 +655,14 @@ systemctl start mpd.socket</programlisting>
<listitem>
<para>
<ulink
url=
"http://sourceforge.net/projects/soxr/"
>
libsoxr
</ulink>
,
the SoX Resampler library
</para>
</listitem>
<listitem>
<para>
internal: low CPU usage, but very poor quality. This is
the fallback if MPD was compiled without an external
resampler.
...
...
@@ -692,6 +700,15 @@ systemctl start mpd.socket</programlisting>
<row>
<entry>
"
<parameter>
soxr
</parameter>
"
</entry>
<entry>
Use libsoxr.
</entry>
</row>
<row>
<entry>
"
<parameter>
Best Sinc Interpolator
</parameter>
" or
"
<parameter>
0
</parameter>
"
</entry>
...
...
src/pcm/ConfiguredResampler.cxx
View file @
3e11a28c
...
...
@@ -29,6 +29,10 @@
#include "LibsamplerateResampler.hxx"
#endif
#ifdef HAVE_SOXR
#include "SoxrResampler.hxx"
#endif
#include <string.h>
enum
class
SelectedResampler
{
...
...
@@ -37,6 +41,10 @@ enum class SelectedResampler {
#ifdef HAVE_LIBSAMPLERATE
LIBSAMPLERATE
,
#endif
#ifdef HAVE_SOXR
SOXR
,
#endif
};
static
SelectedResampler
selected_resampler
=
SelectedResampler
::
FALLBACK
;
...
...
@@ -50,6 +58,13 @@ pcm_resampler_global_init(Error &error)
if
(
strcmp
(
converter
,
"internal"
)
==
0
)
return
true
;
#ifdef HAVE_SOXR
if
(
strcmp
(
converter
,
"soxr"
)
==
0
)
{
selected_resampler
=
SelectedResampler
::
SOXR
;
return
true
;
}
#endif
#ifdef HAVE_LIBSAMPLERATE
selected_resampler
=
SelectedResampler
::
LIBSAMPLERATE
;
return
pcm_resample_lsr_global_init
(
converter
,
error
);
...
...
@@ -75,6 +90,11 @@ pcm_resampler_create()
case
SelectedResampler
:
:
LIBSAMPLERATE
:
return
new
LibsampleratePcmResampler
();
#endif
#ifdef HAVE_SOXR
case
SelectedResampler
:
:
SOXR
:
return
new
SoxrPcmResampler
();
#endif
}
gcc_unreachable
();
...
...
src/pcm/SoxrResampler.cxx
0 → 100644
View file @
3e11a28c
/*
* Copyright (C) 2003-2013 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.
*/
#include "config.h"
#include "SoxrResampler.hxx"
#include "AudioFormat.hxx"
#include "util/ASCII.hxx"
#include "util/Error.hxx"
#include "util/Domain.hxx"
#include "Log.hxx"
#include <soxr.h>
#include <assert.h>
static
constexpr
Domain
soxr_domain
(
"soxr"
);
AudioFormat
SoxrPcmResampler
::
Open
(
AudioFormat
&
af
,
unsigned
new_sample_rate
,
Error
&
error
)
{
assert
(
af
.
IsValid
());
assert
(
audio_valid_sample_rate
(
new_sample_rate
));
soxr_error_t
e
;
soxr
=
soxr_create
(
af
.
sample_rate
,
new_sample_rate
,
af
.
channels
,
&
e
,
nullptr
,
nullptr
,
nullptr
);
if
(
soxr
==
nullptr
)
{
error
.
Format
(
soxr_domain
,
"soxr initialization has failed: %s"
,
e
);
return
AudioFormat
::
Undefined
();
}
FormatDebug
(
soxr_domain
,
"soxr engine '%s'"
,
soxr_engine
(
soxr
));
channels
=
af
.
channels
;
ratio
=
float
(
new_sample_rate
)
/
float
(
af
.
sample_rate
);
FormatDebug
(
soxr_domain
,
"samplerate conversion ratio to %.2lf"
,
ratio
);
/* libsoxr works with floating point samples */
af
.
format
=
SampleFormat
::
FLOAT
;
AudioFormat
result
=
af
;
result
.
sample_rate
=
new_sample_rate
;
return
result
;
}
void
SoxrPcmResampler
::
Close
()
{
soxr_delete
(
soxr
);
}
ConstBuffer
<
void
>
SoxrPcmResampler
::
Resample
(
ConstBuffer
<
void
>
src
,
Error
&
error
)
{
const
size_t
frame_size
=
channels
*
sizeof
(
float
);
assert
(
src
.
size
%
frame_size
==
0
);
const
size_t
n_frames
=
src
.
size
/
frame_size
;
const
size_t
o_frames
=
size_t
(
n_frames
*
ratio
+
0.5
);
float
*
output_buffer
=
(
float
*
)
buffer
.
Get
(
o_frames
*
frame_size
);
size_t
i_done
,
o_done
;
soxr_error_t
e
=
soxr_process
(
soxr
,
src
.
data
,
n_frames
,
&
i_done
,
output_buffer
,
o_frames
,
&
o_done
);
if
(
e
!=
nullptr
)
{
error
.
Format
(
soxr_domain
,
"soxr error: %s"
,
e
);
return
nullptr
;
}
return
{
output_buffer
,
o_done
*
frame_size
};
}
src/pcm/SoxrResampler.hxx
0 → 100644
View file @
3e11a28c
/*
* Copyright (C) 2003-2013 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_PCM_SOXR_RESAMPLER_HXX
#define MPD_PCM_SOXR_RESAMPLER_HXX
#include "Resampler.hxx"
#include "PcmBuffer.hxx"
struct
AudioFormat
;
/**
* A resampler using soxr.
*/
class
SoxrPcmResampler
final
:
public
PcmResampler
{
struct
soxr
*
soxr
;
unsigned
channels
;
float
ratio
;
PcmBuffer
buffer
;
public
:
virtual
AudioFormat
Open
(
AudioFormat
&
af
,
unsigned
new_sample_rate
,
Error
&
error
)
override
;
virtual
void
Close
()
override
;
virtual
ConstBuffer
<
void
>
Resample
(
ConstBuffer
<
void
>
src
,
Error
&
error
)
override
;
};
#endif
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