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
c75cb67c
Commit
c75cb67c
authored
Jul 29, 2013
by
Max Kellermann
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
pcm_buffer: convert to C++
parent
cd1bb2ba
Hide whitespace changes
Inline
Side-by-side
Showing
33 changed files
with
190 additions
and
314 deletions
+190
-314
Makefile.am
Makefile.am
+1
-1
OutputFinish.cxx
src/OutputFinish.cxx
+0
-2
OutputInit.cxx
src/OutputInit.cxx
+0
-2
OutputInternal.hxx
src/OutputInternal.hxx
+2
-2
OutputThread.cxx
src/OutputThread.cxx
+1
-2
FlacCommon.cxx
src/decoder/FlacCommon.cxx
+1
-4
FlacCommon.hxx
src/decoder/FlacCommon.hxx
+2
-5
FlacEncoderPlugin.cxx
src/encoder/FlacEncoderPlugin.cxx
+5
-7
NormalizeFilterPlugin.cxx
src/filter/NormalizeFilterPlugin.cxx
+4
-5
ReplayGainFilterPlugin.cxx
src/filter/ReplayGainFilterPlugin.cxx
+4
-8
RouteFilterPlugin.cxx
src/filter/RouteFilterPlugin.cxx
+4
-9
VolumeFilterPlugin.cxx
src/filter/VolumeFilterPlugin.cxx
+4
-5
PcmBuffer.cxx
src/pcm/PcmBuffer.cxx
+12
-14
PcmBuffer.hxx
src/pcm/PcmBuffer.hxx
+27
-49
PcmChannels.cxx
src/pcm/PcmChannels.cxx
+9
-9
PcmChannels.hxx
src/pcm/PcmChannels.hxx
+5
-5
PcmConvert.cxx
src/pcm/PcmConvert.cxx
+8
-12
PcmConvert.hxx
src/pcm/PcmConvert.hxx
+3
-6
PcmDsd.cxx
src/pcm/PcmDsd.cxx
+1
-5
PcmDsd.hxx
src/pcm/PcmDsd.hxx
+2
-2
PcmDsdUsb.cxx
src/pcm/PcmDsdUsb.cxx
+3
-4
PcmDsdUsb.hxx
src/pcm/PcmDsdUsb.hxx
+2
-2
PcmExport.cxx
src/pcm/PcmExport.cxx
+4
-7
PcmExport.hxx
src/pcm/PcmExport.hxx
+4
-16
PcmFormat.cxx
src/pcm/PcmFormat.cxx
+40
-40
PcmFormat.hxx
src/pcm/PcmFormat.hxx
+9
-9
PcmResample.cxx
src/pcm/PcmResample.cxx
+0
-4
PcmResample.hxx
src/pcm/PcmResample.hxx
+3
-3
PcmResampleFallback.cxx
src/pcm/PcmResampleFallback.cxx
+2
-16
PcmResampleInternal.hxx
src/pcm/PcmResampleInternal.hxx
+0
-6
PcmResampleLibsamplerate.cxx
src/pcm/PcmResampleLibsamplerate.cxx
+11
-16
test_pcm_channels.cxx
test/test_pcm_channels.cxx
+7
-13
test_pcm_format.cxx
test/test_pcm_format.cxx
+10
-24
No files found.
Makefile.am
View file @
c75cb67c
...
@@ -303,7 +303,7 @@ libevent_a_SOURCES = \
...
@@ -303,7 +303,7 @@ libevent_a_SOURCES = \
# PCM library
# PCM library
libpcm_a_SOURCES
=
\
libpcm_a_SOURCES
=
\
src/pcm/
pcm_buffer.c src/pcm/pcm_buffer.h
\
src/pcm/
PcmBuffer.cxx src/pcm/PcmBuffer.hxx
\
src/pcm/PcmExport.cxx src/pcm/PcmExport.hxx
\
src/pcm/PcmExport.cxx src/pcm/PcmExport.hxx
\
src/pcm/PcmConvert.cxx src/pcm/PcmConvert.hxx
\
src/pcm/PcmConvert.cxx src/pcm/PcmConvert.hxx
\
src/pcm/dsd2pcm/dsd2pcm.c src/pcm/dsd2pcm/dsd2pcm.h
\
src/pcm/dsd2pcm/dsd2pcm.c src/pcm/dsd2pcm/dsd2pcm.h
\
...
...
src/OutputFinish.cxx
View file @
c75cb67c
...
@@ -38,8 +38,6 @@ ao_base_finish(struct audio_output *ao)
...
@@ -38,8 +38,6 @@ ao_base_finish(struct audio_output *ao)
delete
ao
->
replay_gain_filter
;
delete
ao
->
replay_gain_filter
;
delete
ao
->
other_replay_gain_filter
;
delete
ao
->
other_replay_gain_filter
;
delete
ao
->
filter
;
delete
ao
->
filter
;
pcm_buffer_deinit
(
&
ao
->
cross_fade_buffer
);
}
}
void
void
...
...
src/OutputInit.cxx
View file @
c75cb67c
...
@@ -176,8 +176,6 @@ ao_base_init(struct audio_output *ao,
...
@@ -176,8 +176,6 @@ ao_base_init(struct audio_output *ao,
ao
->
allow_play
=
true
;
ao
->
allow_play
=
true
;
ao
->
fail_timer
=
NULL
;
ao
->
fail_timer
=
NULL
;
pcm_buffer_init
(
&
ao
->
cross_fade_buffer
);
/* set up the filter chain */
/* set up the filter chain */
ao
->
filter
=
filter_chain_new
();
ao
->
filter
=
filter_chain_new
();
...
...
src/OutputInternal.hxx
View file @
c75cb67c
...
@@ -21,7 +21,7 @@
...
@@ -21,7 +21,7 @@
#define MPD_OUTPUT_INTERNAL_HXX
#define MPD_OUTPUT_INTERNAL_HXX
#include "audio_format.h"
#include "audio_format.h"
#include "pcm/
pcm_buffer.h
"
#include "pcm/
PcmBuffer.hxx
"
#include "thread/Mutex.hxx"
#include "thread/Mutex.hxx"
#include "thread/Cond.hxx"
#include "thread/Cond.hxx"
...
@@ -153,7 +153,7 @@ struct audio_output {
...
@@ -153,7 +153,7 @@ struct audio_output {
/**
/**
* The buffer used to allocate the cross-fading result.
* The buffer used to allocate the cross-fading result.
*/
*/
struct
pcm_b
uffer
cross_fade_buffer
;
PcmB
uffer
cross_fade_buffer
;
/**
/**
* The filter object of this audio output. This is an
* The filter object of this audio output. This is an
...
...
src/OutputThread.cxx
View file @
c75cb67c
...
@@ -395,8 +395,7 @@ ao_filter_chunk(struct audio_output *ao, const struct music_chunk *chunk,
...
@@ -395,8 +395,7 @@ ao_filter_chunk(struct audio_output *ao, const struct music_chunk *chunk,
if
(
length
>
other_length
)
if
(
length
>
other_length
)
length
=
other_length
;
length
=
other_length
;
void
*
dest
=
pcm_buffer_get
(
&
ao
->
cross_fade_buffer
,
void
*
dest
=
ao
->
cross_fade_buffer
.
Get
(
other_length
);
other_length
);
memcpy
(
dest
,
other_data
,
other_length
);
memcpy
(
dest
,
other_data
,
other_length
);
if
(
!
pcm_mix
(
dest
,
data
,
length
,
if
(
!
pcm_mix
(
dest
,
data
,
length
,
sample_format
(
ao
->
in_audio_format
.
format
),
sample_format
(
ao
->
in_audio_format
.
format
),
...
...
src/decoder/FlacCommon.cxx
View file @
c75cb67c
...
@@ -39,13 +39,10 @@ flac_data::flac_data(struct decoder *_decoder,
...
@@ -39,13 +39,10 @@ flac_data::flac_data(struct decoder *_decoder,
decoder
(
_decoder
),
input_stream
(
_input_stream
),
decoder
(
_decoder
),
input_stream
(
_input_stream
),
tag
(
nullptr
)
tag
(
nullptr
)
{
{
pcm_buffer_init
(
&
buffer
);
}
}
flac_data
::~
flac_data
()
flac_data
::~
flac_data
()
{
{
pcm_buffer_deinit
(
&
buffer
);
if
(
tag
!=
nullptr
)
if
(
tag
!=
nullptr
)
tag_free
(
tag
);
tag_free
(
tag
);
}
}
...
@@ -178,7 +175,7 @@ flac_common_write(struct flac_data *data, const FLAC__Frame * frame,
...
@@ -178,7 +175,7 @@ flac_common_write(struct flac_data *data, const FLAC__Frame * frame,
return
FLAC__STREAM_DECODER_WRITE_STATUS_ABORT
;
return
FLAC__STREAM_DECODER_WRITE_STATUS_ABORT
;
size_t
buffer_size
=
frame
->
header
.
blocksize
*
data
->
frame_size
;
size_t
buffer_size
=
frame
->
header
.
blocksize
*
data
->
frame_size
;
buffer
=
pcm_buffer_get
(
&
data
->
buffer
,
buffer_size
);
buffer
=
data
->
buffer
.
Get
(
buffer_size
);
flac_convert
(
buffer
,
frame
->
header
.
channels
,
flac_convert
(
buffer
,
frame
->
header
.
channels
,
(
enum
sample_format
)
data
->
audio_format
.
format
,
buf
,
(
enum
sample_format
)
data
->
audio_format
.
format
,
buf
,
...
...
src/decoder/FlacCommon.hxx
View file @
c75cb67c
...
@@ -26,10 +26,7 @@
...
@@ -26,10 +26,7 @@
#include "FlacInput.hxx"
#include "FlacInput.hxx"
#include "DecoderAPI.hxx"
#include "DecoderAPI.hxx"
#include "pcm/PcmBuffer.hxx"
extern
"C"
{
#include "pcm/pcm_buffer.h"
}
#include <FLAC/stream_decoder.h>
#include <FLAC/stream_decoder.h>
#include <FLAC/metadata.h>
#include <FLAC/metadata.h>
...
@@ -38,7 +35,7 @@ extern "C" {
...
@@ -38,7 +35,7 @@ extern "C" {
#define G_LOG_DOMAIN "flac"
#define G_LOG_DOMAIN "flac"
struct
flac_data
:
public
FlacInput
{
struct
flac_data
:
public
FlacInput
{
struct
pcm_b
uffer
buffer
;
PcmB
uffer
buffer
;
/**
/**
* The size of one frame in the output buffer.
* The size of one frame in the output buffer.
...
...
src/encoder/FlacEncoderPlugin.cxx
View file @
c75cb67c
...
@@ -22,7 +22,7 @@
...
@@ -22,7 +22,7 @@
#include "encoder_api.h"
#include "encoder_api.h"
#include "encoder_plugin.h"
#include "encoder_plugin.h"
#include "audio_format.h"
#include "audio_format.h"
#include "pcm/
pcm_buffer.h
"
#include "pcm/
PcmBuffer.hxx
"
#include "util/fifo_buffer.h"
#include "util/fifo_buffer.h"
extern
"C"
{
extern
"C"
{
...
@@ -46,7 +46,7 @@ struct flac_encoder {
...
@@ -46,7 +46,7 @@ struct flac_encoder {
FLAC__StreamEncoder
*
fse
;
FLAC__StreamEncoder
*
fse
;
struct
pcm_b
uffer
expand_buffer
;
PcmB
uffer
expand_buffer
;
/**
/**
* This buffer will hold encoded data from libFLAC until it is
* This buffer will hold encoded data from libFLAC until it is
...
@@ -160,7 +160,7 @@ flac_encoder_close(struct encoder *_encoder)
...
@@ -160,7 +160,7 @@ flac_encoder_close(struct encoder *_encoder)
FLAC__stream_encoder_delete
(
encoder
->
fse
);
FLAC__stream_encoder_delete
(
encoder
->
fse
);
pcm_buffer_deinit
(
&
encoder
->
expand_buffer
);
encoder
->
expand_buffer
.
Clear
(
);
fifo_buffer_free
(
encoder
->
output_buffer
);
fifo_buffer_free
(
encoder
->
output_buffer
);
}
}
...
@@ -205,8 +205,6 @@ flac_encoder_open(struct encoder *_encoder, struct audio_format *audio_format,
...
@@ -205,8 +205,6 @@ flac_encoder_open(struct encoder *_encoder, struct audio_format *audio_format,
return
false
;
return
false
;
}
}
pcm_buffer_init
(
&
encoder
->
expand_buffer
);
encoder
->
output_buffer
=
growing_fifo_new
();
encoder
->
output_buffer
=
growing_fifo_new
();
/* this immediately outputs data through callback */
/* this immediately outputs data through callback */
...
@@ -275,14 +273,14 @@ flac_encoder_write(struct encoder *_encoder,
...
@@ -275,14 +273,14 @@ flac_encoder_write(struct encoder *_encoder,
switch
(
encoder
->
audio_format
.
format
)
{
switch
(
encoder
->
audio_format
.
format
)
{
case
SAMPLE_FORMAT_S8
:
case
SAMPLE_FORMAT_S8
:
exbuffer
=
pcm_buffer_get
(
&
encoder
->
expand_buffer
,
length
*
4
);
exbuffer
=
encoder
->
expand_buffer
.
Get
(
length
*
4
);
pcm8_to_flac
((
int32_t
*
)
exbuffer
,
(
const
int8_t
*
)
data
,
pcm8_to_flac
((
int32_t
*
)
exbuffer
,
(
const
int8_t
*
)
data
,
num_samples
);
num_samples
);
buffer
=
exbuffer
;
buffer
=
exbuffer
;
break
;
break
;
case
SAMPLE_FORMAT_S16
:
case
SAMPLE_FORMAT_S16
:
exbuffer
=
pcm_buffer_get
(
&
encoder
->
expand_buffer
,
length
*
2
);
exbuffer
=
encoder
->
expand_buffer
.
Get
(
length
*
2
);
pcm16_to_flac
((
int32_t
*
)
exbuffer
,
(
const
int16_t
*
)
data
,
pcm16_to_flac
((
int32_t
*
)
exbuffer
,
(
const
int16_t
*
)
data
,
num_samples
);
num_samples
);
buffer
=
exbuffer
;
buffer
=
exbuffer
;
...
...
src/filter/NormalizeFilterPlugin.cxx
View file @
c75cb67c
...
@@ -21,7 +21,7 @@
...
@@ -21,7 +21,7 @@
#include "FilterPlugin.hxx"
#include "FilterPlugin.hxx"
#include "FilterInternal.hxx"
#include "FilterInternal.hxx"
#include "FilterRegistry.hxx"
#include "FilterRegistry.hxx"
#include "pcm/
pcm_buffer.h
"
#include "pcm/
PcmBuffer.hxx
"
#include "audio_format.h"
#include "audio_format.h"
#include "AudioCompress/compress.h"
#include "AudioCompress/compress.h"
...
@@ -31,7 +31,7 @@
...
@@ -31,7 +31,7 @@
class
NormalizeFilter
final
:
public
Filter
{
class
NormalizeFilter
final
:
public
Filter
{
struct
Compressor
*
compressor
;
struct
Compressor
*
compressor
;
struct
pcm_b
uffer
buffer
;
PcmB
uffer
buffer
;
public
:
public
:
virtual
const
audio_format
*
Open
(
audio_format
&
af
,
GError
**
error_r
);
virtual
const
audio_format
*
Open
(
audio_format
&
af
,
GError
**
error_r
);
...
@@ -53,7 +53,6 @@ NormalizeFilter::Open(audio_format &audio_format, gcc_unused GError **error_r)
...
@@ -53,7 +53,6 @@ NormalizeFilter::Open(audio_format &audio_format, gcc_unused GError **error_r)
audio_format
.
format
=
SAMPLE_FORMAT_S16
;
audio_format
.
format
=
SAMPLE_FORMAT_S16
;
compressor
=
Compressor_new
(
0
);
compressor
=
Compressor_new
(
0
);
pcm_buffer_init
(
&
buffer
);
return
&
audio_format
;
return
&
audio_format
;
}
}
...
@@ -61,7 +60,7 @@ NormalizeFilter::Open(audio_format &audio_format, gcc_unused GError **error_r)
...
@@ -61,7 +60,7 @@ NormalizeFilter::Open(audio_format &audio_format, gcc_unused GError **error_r)
void
void
NormalizeFilter
::
Close
()
NormalizeFilter
::
Close
()
{
{
pcm_buffer_deinit
(
&
buffer
);
buffer
.
Clear
(
);
Compressor_delete
(
compressor
);
Compressor_delete
(
compressor
);
}
}
...
@@ -69,7 +68,7 @@ const void *
...
@@ -69,7 +68,7 @@ const void *
NormalizeFilter
::
FilterPCM
(
const
void
*
src
,
size_t
src_size
,
NormalizeFilter
::
FilterPCM
(
const
void
*
src
,
size_t
src_size
,
size_t
*
dest_size_r
,
gcc_unused
GError
**
error_r
)
size_t
*
dest_size_r
,
gcc_unused
GError
**
error_r
)
{
{
int16_t
*
dest
=
(
int16_t
*
)
pcm_buffer_get
(
&
buffer
,
src_size
);
int16_t
*
dest
=
(
int16_t
*
)
buffer
.
Get
(
src_size
);
memcpy
(
dest
,
src
,
src_size
);
memcpy
(
dest
,
src
,
src_size
);
Compressor_Process_int16
(
compressor
,
dest
,
src_size
/
2
);
Compressor_Process_int16
(
compressor
,
dest
,
src_size
/
2
);
...
...
src/filter/ReplayGainFilterPlugin.cxx
View file @
c75cb67c
...
@@ -27,10 +27,7 @@
...
@@ -27,10 +27,7 @@
#include "replay_gain_config.h"
#include "replay_gain_config.h"
#include "MixerControl.hxx"
#include "MixerControl.hxx"
#include "pcm/PcmVolume.hxx"
#include "pcm/PcmVolume.hxx"
#include "pcm/PcmBuffer.hxx"
extern
"C"
{
#include "pcm/pcm_buffer.h"
}
#include <assert.h>
#include <assert.h>
#include <string.h>
#include <string.h>
...
@@ -71,7 +68,7 @@ class ReplayGainFilter final : public Filter {
...
@@ -71,7 +68,7 @@ class ReplayGainFilter final : public Filter {
struct
audio_format
format
;
struct
audio_format
format
;
struct
pcm_b
uffer
buffer
;
PcmB
uffer
buffer
;
public
:
public
:
ReplayGainFilter
()
ReplayGainFilter
()
...
@@ -166,7 +163,6 @@ const audio_format *
...
@@ -166,7 +163,6 @@ const audio_format *
ReplayGainFilter
::
Open
(
audio_format
&
af
,
gcc_unused
GError
**
error_r
)
ReplayGainFilter
::
Open
(
audio_format
&
af
,
gcc_unused
GError
**
error_r
)
{
{
format
=
af
;
format
=
af
;
pcm_buffer_init
(
&
buffer
);
return
&
format
;
return
&
format
;
}
}
...
@@ -174,7 +170,7 @@ ReplayGainFilter::Open(audio_format &af, gcc_unused GError **error_r)
...
@@ -174,7 +170,7 @@ ReplayGainFilter::Open(audio_format &af, gcc_unused GError **error_r)
void
void
ReplayGainFilter
::
Close
()
ReplayGainFilter
::
Close
()
{
{
pcm_buffer_deinit
(
&
buffer
);
buffer
.
Clear
(
);
}
}
const
void
*
const
void
*
...
@@ -188,7 +184,7 @@ ReplayGainFilter::FilterPCM(const void *src, size_t src_size,
...
@@ -188,7 +184,7 @@ ReplayGainFilter::FilterPCM(const void *src, size_t src_size,
/* optimized special case: 100% volume = no-op */
/* optimized special case: 100% volume = no-op */
return
src
;
return
src
;
void
*
dest
=
pcm_buffer_get
(
&
buffer
,
src_size
);
void
*
dest
=
buffer
.
Get
(
src_size
);
if
(
volume
<=
0
)
{
if
(
volume
<=
0
)
{
/* optimized special case: 0% volume = memset(0) */
/* optimized special case: 0% volume = memset(0) */
/* XXX is this valid for all sample formats? What
/* XXX is this valid for all sample formats? What
...
...
src/filter/RouteFilterPlugin.cxx
View file @
c75cb67c
...
@@ -47,7 +47,7 @@
...
@@ -47,7 +47,7 @@
#include "FilterPlugin.hxx"
#include "FilterPlugin.hxx"
#include "FilterInternal.hxx"
#include "FilterInternal.hxx"
#include "FilterRegistry.hxx"
#include "FilterRegistry.hxx"
#include "pcm/
pcm_buffer.h
"
#include "pcm/
PcmBuffer.hxx
"
#include <assert.h>
#include <assert.h>
#include <string.h>
#include <string.h>
...
@@ -101,7 +101,7 @@ class RouteFilter final : public Filter {
...
@@ -101,7 +101,7 @@ class RouteFilter final : public Filter {
/**
/**
* The output buffer used last time around, can be reused if the size doesn't differ.
* The output buffer used last time around, can be reused if the size doesn't differ.
*/
*/
struct
pcm_b
uffer
output_buffer
;
PcmB
uffer
output_buffer
;
public
:
public
:
RouteFilter
()
:
sources
(
nullptr
)
{}
RouteFilter
()
:
sources
(
nullptr
)
{}
...
@@ -256,16 +256,13 @@ RouteFilter::Open(audio_format &audio_format, gcc_unused GError **error_r)
...
@@ -256,16 +256,13 @@ RouteFilter::Open(audio_format &audio_format, gcc_unused GError **error_r)
// Precalculate this simple value, to speed up allocation later
// Precalculate this simple value, to speed up allocation later
output_frame_size
=
audio_format_frame_size
(
&
output_format
);
output_frame_size
=
audio_format_frame_size
(
&
output_format
);
// This buffer grows as needed
pcm_buffer_init
(
&
output_buffer
);
return
&
output_format
;
return
&
output_format
;
}
}
void
void
RouteFilter
::
Close
()
RouteFilter
::
Close
()
{
{
pcm_buffer_deinit
(
&
output_buffer
);
output_buffer
.
Clear
(
);
}
}
const
void
*
const
void
*
...
@@ -285,9 +282,7 @@ RouteFilter::FilterPCM(const void *src, size_t src_size,
...
@@ -285,9 +282,7 @@ RouteFilter::FilterPCM(const void *src, size_t src_size,
// Grow our reusable buffer, if needed, and set the moving pointer
// Grow our reusable buffer, if needed, and set the moving pointer
*
dest_size_r
=
number_of_frames
*
output_frame_size
;
*
dest_size_r
=
number_of_frames
*
output_frame_size
;
chan_destination
=
(
uint8_t
*
)
chan_destination
=
(
uint8_t
*
)
output_buffer
.
Get
(
*
dest_size_r
);
pcm_buffer_get
(
&
output_buffer
,
*
dest_size_r
);
// Perform our copy operations, with N input channels and M output channels
// Perform our copy operations, with N input channels and M output channels
for
(
unsigned
int
s
=
0
;
s
<
number_of_frames
;
++
s
)
{
for
(
unsigned
int
s
=
0
;
s
<
number_of_frames
;
++
s
)
{
...
...
src/filter/VolumeFilterPlugin.cxx
View file @
c75cb67c
...
@@ -23,8 +23,8 @@
...
@@ -23,8 +23,8 @@
#include "FilterInternal.hxx"
#include "FilterInternal.hxx"
#include "FilterRegistry.hxx"
#include "FilterRegistry.hxx"
#include "conf.h"
#include "conf.h"
#include "pcm/pcm_buffer.h"
#include "pcm/PcmVolume.hxx"
#include "pcm/PcmVolume.hxx"
#include "pcm/PcmBuffer.hxx"
#include "audio_format.h"
#include "audio_format.h"
#include <assert.h>
#include <assert.h>
...
@@ -38,7 +38,7 @@ class VolumeFilter final : public Filter {
...
@@ -38,7 +38,7 @@ class VolumeFilter final : public Filter {
struct
audio_format
format
;
struct
audio_format
format
;
struct
pcm_b
uffer
buffer
;
PcmB
uffer
buffer
;
public
:
public
:
VolumeFilter
()
VolumeFilter
()
...
@@ -79,7 +79,6 @@ const struct audio_format *
...
@@ -79,7 +79,6 @@ const struct audio_format *
VolumeFilter
::
Open
(
audio_format
&
audio_format
,
gcc_unused
GError
**
error_r
)
VolumeFilter
::
Open
(
audio_format
&
audio_format
,
gcc_unused
GError
**
error_r
)
{
{
format
=
audio_format
;
format
=
audio_format
;
pcm_buffer_init
(
&
buffer
);
return
&
format
;
return
&
format
;
}
}
...
@@ -87,7 +86,7 @@ VolumeFilter::Open(audio_format &audio_format, gcc_unused GError **error_r)
...
@@ -87,7 +86,7 @@ VolumeFilter::Open(audio_format &audio_format, gcc_unused GError **error_r)
void
void
VolumeFilter
::
Close
()
VolumeFilter
::
Close
()
{
{
pcm_buffer_deinit
(
&
buffer
);
buffer
.
Clear
(
);
}
}
const
void
*
const
void
*
...
@@ -100,7 +99,7 @@ VolumeFilter::FilterPCM(const void *src, size_t src_size,
...
@@ -100,7 +99,7 @@ VolumeFilter::FilterPCM(const void *src, size_t src_size,
/* optimized special case: 100% volume = no-op */
/* optimized special case: 100% volume = no-op */
return
src
;
return
src
;
void
*
dest
=
pcm_buffer_get
(
&
buffer
,
src_size
);
void
*
dest
=
buffer
.
Get
(
src_size
);
if
(
volume
<=
0
)
{
if
(
volume
<=
0
)
{
/* optimized special case: 0% volume = memset(0) */
/* optimized special case: 0% volume = memset(0) */
...
...
src/pcm/
pcm_buffer.c
→
src/pcm/
PcmBuffer.cxx
View file @
c75cb67c
/*
/*
* Copyright (C) 2003-201
1
The Music Player Daemon Project
* Copyright (C) 2003-201
3
The Music Player Daemon Project
* http://www.musicpd.org
* http://www.musicpd.org
*
*
* This program is free software; you can redistribute it and/or modify
* This program is free software; you can redistribute it and/or modify
...
@@ -18,7 +18,7 @@
...
@@ -18,7 +18,7 @@
*/
*/
#include "config.h"
#include "config.h"
#include "
pcm_buffer.h
"
#include "
PcmBuffer.hxx
"
#include "poison.h"
#include "poison.h"
/**
/**
...
@@ -32,27 +32,25 @@ align_8k(size_t size)
...
@@ -32,27 +32,25 @@ align_8k(size_t size)
}
}
void
*
void
*
pcm_buffer_get
(
struct
pcm_buffer
*
buffer
,
size_t
size
)
PcmBuffer
::
Get
(
size_t
new_
size
)
{
{
assert
(
buffer
!=
NULL
);
if
(
new_size
==
0
)
if
(
size
==
0
)
/* never return NULL, because NULL would be assumed to
/* never return NULL, because NULL would be assumed to
be an error condition */
be an error condition */
size
=
1
;
new_
size
=
1
;
if
(
buffer
->
size
<
size
)
{
if
(
size
<
new_
size
)
{
/* free the old buffer */
/* free the old buffer */
g_free
(
buffer
->
buffer
);
g_free
(
buffer
);
buffer
->
size
=
align_8k
(
size
);
size
=
align_8k
(
new_
size
);
buffer
->
buffer
=
g_malloc
(
buffer
->
size
);
buffer
=
g_malloc
(
size
);
}
else
{
}
else
{
/* discard old buffer contents */
/* discard old buffer contents */
poison_undefined
(
buffer
->
buffer
,
buffer
->
size
);
poison_undefined
(
buffer
,
size
);
}
}
assert
(
buffer
->
size
>=
size
);
assert
(
size
>=
new_
size
);
return
buffer
->
buffer
;
return
buffer
;
}
}
src/pcm/
pcm_buffer.h
→
src/pcm/
PcmBuffer.hxx
View file @
c75cb67c
/*
/*
* Copyright (C) 2003-201
1
The Music Player Daemon Project
* Copyright (C) 2003-201
3
The Music Player Daemon Project
* http://www.musicpd.org
* http://www.musicpd.org
*
*
* This program is free software; you can redistribute it and/or modify
* This program is free software; you can redistribute it and/or modify
...
@@ -17,10 +17,11 @@
...
@@ -17,10 +17,11 @@
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
*/
#ifndef PCM_BUFFER_H
#ifndef PCM_BUFFER_H
XX
#define PCM_BUFFER_H
#define PCM_BUFFER_H
XX
#include "check.h"
#include "check.h"
#include "gcc.h"
#include <glib.h>
#include <glib.h>
...
@@ -31,55 +32,32 @@
...
@@ -31,55 +32,32 @@
* allocate a new buffer every time pcm_convert() is called, but that
* allocate a new buffer every time pcm_convert() is called, but that
* would put too much stress on the allocator.
* would put too much stress on the allocator.
*/
*/
struct
pcm_b
uffer
{
struct
PcmB
uffer
{
void
*
buffer
;
void
*
buffer
;
size_t
size
;
size_t
size
;
};
/**
* Initialize the buffer, but don't allocate anything yet.
*/
static
inline
void
pcm_buffer_init
(
struct
pcm_buffer
*
buffer
)
{
assert
(
buffer
!=
NULL
);
buffer
->
buffer
=
NULL
;
buffer
->
size
=
0
;
}
/**
* Free resources. This function may be called more than once.
*/
static
inline
void
pcm_buffer_deinit
(
struct
pcm_buffer
*
buffer
)
{
assert
(
buffer
!=
NULL
);
g_free
(
buffer
->
buffer
);
buffer
->
buffer
=
NULL
;
PcmBuffer
()
:
buffer
(
nullptr
),
size
(
0
)
{}
}
~
PcmBuffer
()
{
#ifdef __cplusplus
g_free
(
buffer
);
extern
"C"
{
}
#endif
void
Clear
()
{
/**
g_free
(
buffer
);
* Get the buffer, and guarantee a minimum size. This buffer becomes
buffer
=
nullptr
;
* invalid with the next pcm_buffer_get() call.
}
*
* This function will never return NULL, even if size is zero, because
/**
* the PCM library uses the NULL return value to signal "error". An
* Get the buffer, and guarantee a minimum size. This buffer becomes
* empty destination buffer is not always an error
.
* invalid with the next pcm_buffer_get() call
.
*/
*
G_GNUC_MALLOC
* This function will never return NULL, even if size is zero, because
void
*
* the PCM library uses the NULL return value to signal "error". An
pcm_buffer_get
(
struct
pcm_buffer
*
buffer
,
size_t
size
);
* empty destination buffer is not always an error.
*/
#ifdef __cplusplus
gcc_malloc
}
void
*
Get
(
size_t
size
);
#endif
};
#endif
#endif
src/pcm/PcmChannels.cxx
View file @
c75cb67c
...
@@ -19,7 +19,7 @@
...
@@ -19,7 +19,7 @@
#include "config.h"
#include "config.h"
#include "PcmChannels.hxx"
#include "PcmChannels.hxx"
#include "
pcm_buffer.h
"
#include "
PcmBuffer.hxx
"
#include "PcmUtils.hxx"
#include "PcmUtils.hxx"
#include <assert.h>
#include <assert.h>
...
@@ -74,7 +74,7 @@ pcm_convert_channels_16_n_to_2(int16_t *restrict dest,
...
@@ -74,7 +74,7 @@ pcm_convert_channels_16_n_to_2(int16_t *restrict dest,
}
}
const
int16_t
*
const
int16_t
*
pcm_convert_channels_16
(
struct
pcm_buffer
*
buffer
,
pcm_convert_channels_16
(
PcmBuffer
&
buffer
,
unsigned
dest_channels
,
unsigned
dest_channels
,
unsigned
src_channels
,
const
int16_t
*
src
,
unsigned
src_channels
,
const
int16_t
*
src
,
size_t
src_size
,
size_t
*
dest_size_r
)
size_t
src_size
,
size_t
*
dest_size_r
)
...
@@ -84,7 +84,7 @@ pcm_convert_channels_16(struct pcm_buffer *buffer,
...
@@ -84,7 +84,7 @@ pcm_convert_channels_16(struct pcm_buffer *buffer,
size_t
dest_size
=
src_size
/
src_channels
*
dest_channels
;
size_t
dest_size
=
src_size
/
src_channels
*
dest_channels
;
*
dest_size_r
=
dest_size
;
*
dest_size_r
=
dest_size
;
int16_t
*
dest
=
(
int16_t
*
)
pcm_buffer_get
(
buffer
,
dest_size
);
int16_t
*
dest
=
(
int16_t
*
)
buffer
.
Get
(
dest_size
);
const
int16_t
*
src_end
=
pcm_end_pointer
(
src
,
src_size
);
const
int16_t
*
src_end
=
pcm_end_pointer
(
src
,
src_size
);
if
(
src_channels
==
1
&&
dest_channels
==
2
)
if
(
src_channels
==
1
&&
dest_channels
==
2
)
...
@@ -137,7 +137,7 @@ pcm_convert_channels_24_n_to_2(int32_t *restrict dest,
...
@@ -137,7 +137,7 @@ pcm_convert_channels_24_n_to_2(int32_t *restrict dest,
}
}
const
int32_t
*
const
int32_t
*
pcm_convert_channels_24
(
struct
pcm_buffer
*
buffer
,
pcm_convert_channels_24
(
PcmBuffer
&
buffer
,
unsigned
dest_channels
,
unsigned
dest_channels
,
unsigned
src_channels
,
const
int32_t
*
src
,
unsigned
src_channels
,
const
int32_t
*
src
,
size_t
src_size
,
size_t
*
dest_size_r
)
size_t
src_size
,
size_t
*
dest_size_r
)
...
@@ -147,7 +147,7 @@ pcm_convert_channels_24(struct pcm_buffer *buffer,
...
@@ -147,7 +147,7 @@ pcm_convert_channels_24(struct pcm_buffer *buffer,
size_t
dest_size
=
src_size
/
src_channels
*
dest_channels
;
size_t
dest_size
=
src_size
/
src_channels
*
dest_channels
;
*
dest_size_r
=
dest_size
;
*
dest_size_r
=
dest_size
;
int32_t
*
dest
=
(
int32_t
*
)
pcm_buffer_get
(
buffer
,
dest_size
);
int32_t
*
dest
=
(
int32_t
*
)
buffer
.
Get
(
dest_size
);
const
int32_t
*
src_end
=
(
const
int32_t
*
)
const
int32_t
*
src_end
=
(
const
int32_t
*
)
pcm_end_pointer
(
src
,
src_size
);
pcm_end_pointer
(
src
,
src_size
);
...
@@ -200,7 +200,7 @@ pcm_convert_channels_32_n_to_2(int32_t *dest,
...
@@ -200,7 +200,7 @@ pcm_convert_channels_32_n_to_2(int32_t *dest,
}
}
const
int32_t
*
const
int32_t
*
pcm_convert_channels_32
(
struct
pcm_buffer
*
buffer
,
pcm_convert_channels_32
(
PcmBuffer
&
buffer
,
unsigned
dest_channels
,
unsigned
dest_channels
,
unsigned
src_channels
,
const
int32_t
*
src
,
unsigned
src_channels
,
const
int32_t
*
src
,
size_t
src_size
,
size_t
*
dest_size_r
)
size_t
src_size
,
size_t
*
dest_size_r
)
...
@@ -210,7 +210,7 @@ pcm_convert_channels_32(struct pcm_buffer *buffer,
...
@@ -210,7 +210,7 @@ pcm_convert_channels_32(struct pcm_buffer *buffer,
size_t
dest_size
=
src_size
/
src_channels
*
dest_channels
;
size_t
dest_size
=
src_size
/
src_channels
*
dest_channels
;
*
dest_size_r
=
dest_size
;
*
dest_size_r
=
dest_size
;
int32_t
*
dest
=
(
int32_t
*
)
pcm_buffer_get
(
buffer
,
dest_size
);
int32_t
*
dest
=
(
int32_t
*
)
buffer
.
Get
(
dest_size
);
const
int32_t
*
src_end
=
(
const
int32_t
*
)
const
int32_t
*
src_end
=
(
const
int32_t
*
)
pcm_end_pointer
(
src
,
src_size
);
pcm_end_pointer
(
src
,
src_size
);
...
@@ -263,7 +263,7 @@ pcm_convert_channels_float_n_to_2(float *dest,
...
@@ -263,7 +263,7 @@ pcm_convert_channels_float_n_to_2(float *dest,
}
}
const
float
*
const
float
*
pcm_convert_channels_float
(
struct
pcm_buffer
*
buffer
,
pcm_convert_channels_float
(
PcmBuffer
&
buffer
,
unsigned
dest_channels
,
unsigned
dest_channels
,
unsigned
src_channels
,
const
float
*
src
,
unsigned
src_channels
,
const
float
*
src
,
size_t
src_size
,
size_t
*
dest_size_r
)
size_t
src_size
,
size_t
*
dest_size_r
)
...
@@ -273,7 +273,7 @@ pcm_convert_channels_float(struct pcm_buffer *buffer,
...
@@ -273,7 +273,7 @@ pcm_convert_channels_float(struct pcm_buffer *buffer,
size_t
dest_size
=
src_size
/
src_channels
*
dest_channels
;
size_t
dest_size
=
src_size
/
src_channels
*
dest_channels
;
*
dest_size_r
=
dest_size
;
*
dest_size_r
=
dest_size
;
float
*
dest
=
(
float
*
)
pcm_buffer_get
(
buffer
,
dest_size
);
float
*
dest
=
(
float
*
)
buffer
.
Get
(
dest_size
);
const
float
*
src_end
=
(
const
float
*
)
pcm_end_pointer
(
src
,
src_size
);
const
float
*
src_end
=
(
const
float
*
)
pcm_end_pointer
(
src
,
src_size
);
if
(
src_channels
==
1
&&
dest_channels
==
2
)
if
(
src_channels
==
1
&&
dest_channels
==
2
)
...
...
src/pcm/PcmChannels.hxx
View file @
c75cb67c
...
@@ -23,7 +23,7 @@
...
@@ -23,7 +23,7 @@
#include <stdint.h>
#include <stdint.h>
#include <stddef.h>
#include <stddef.h>
struct
pcm_b
uffer
;
struct
PcmB
uffer
;
/**
/**
* Changes the number of channels in 16 bit PCM data.
* Changes the number of channels in 16 bit PCM data.
...
@@ -37,7 +37,7 @@ struct pcm_buffer;
...
@@ -37,7 +37,7 @@ struct pcm_buffer;
* @return the destination buffer
* @return the destination buffer
*/
*/
const
int16_t
*
const
int16_t
*
pcm_convert_channels_16
(
struct
pcm_buffer
*
buffer
,
pcm_convert_channels_16
(
PcmBuffer
&
buffer
,
unsigned
dest_channels
,
unsigned
dest_channels
,
unsigned
src_channels
,
const
int16_t
*
src
,
unsigned
src_channels
,
const
int16_t
*
src
,
size_t
src_size
,
size_t
*
dest_size_r
);
size_t
src_size
,
size_t
*
dest_size_r
);
...
@@ -55,7 +55,7 @@ pcm_convert_channels_16(struct pcm_buffer *buffer,
...
@@ -55,7 +55,7 @@ pcm_convert_channels_16(struct pcm_buffer *buffer,
* @return the destination buffer
* @return the destination buffer
*/
*/
const
int32_t
*
const
int32_t
*
pcm_convert_channels_24
(
struct
pcm_buffer
*
buffer
,
pcm_convert_channels_24
(
PcmBuffer
&
buffer
,
unsigned
dest_channels
,
unsigned
dest_channels
,
unsigned
src_channels
,
const
int32_t
*
src
,
unsigned
src_channels
,
const
int32_t
*
src
,
size_t
src_size
,
size_t
*
dest_size_r
);
size_t
src_size
,
size_t
*
dest_size_r
);
...
@@ -72,7 +72,7 @@ pcm_convert_channels_24(struct pcm_buffer *buffer,
...
@@ -72,7 +72,7 @@ pcm_convert_channels_24(struct pcm_buffer *buffer,
* @return the destination buffer
* @return the destination buffer
*/
*/
const
int32_t
*
const
int32_t
*
pcm_convert_channels_32
(
struct
pcm_buffer
*
buffer
,
pcm_convert_channels_32
(
PcmBuffer
&
buffer
,
unsigned
dest_channels
,
unsigned
dest_channels
,
unsigned
src_channels
,
const
int32_t
*
src
,
unsigned
src_channels
,
const
int32_t
*
src
,
size_t
src_size
,
size_t
*
dest_size_r
);
size_t
src_size
,
size_t
*
dest_size_r
);
...
@@ -89,7 +89,7 @@ pcm_convert_channels_32(struct pcm_buffer *buffer,
...
@@ -89,7 +89,7 @@ pcm_convert_channels_32(struct pcm_buffer *buffer,
* @return the destination buffer
* @return the destination buffer
*/
*/
const
float
*
const
float
*
pcm_convert_channels_float
(
struct
pcm_buffer
*
buffer
,
pcm_convert_channels_float
(
PcmBuffer
&
buffer
,
unsigned
dest_channels
,
unsigned
dest_channels
,
unsigned
src_channels
,
const
float
*
src
,
unsigned
src_channels
,
const
float
*
src
,
size_t
src_size
,
size_t
*
dest_size_r
);
size_t
src_size
,
size_t
*
dest_size_r
);
...
...
src/pcm/PcmConvert.cxx
View file @
c75cb67c
...
@@ -34,14 +34,10 @@
...
@@ -34,14 +34,10 @@
PcmConvert
::
PcmConvert
()
PcmConvert
::
PcmConvert
()
{
{
pcm_buffer_init
(
&
format_buffer
);
pcm_buffer_init
(
&
channels_buffer
);
}
}
PcmConvert
::~
PcmConvert
()
PcmConvert
::~
PcmConvert
()
{
{
pcm_buffer_deinit
(
&
format_buffer
);
pcm_buffer_deinit
(
&
channels_buffer
);
}
}
void
void
...
@@ -62,7 +58,7 @@ PcmConvert::Convert16(const audio_format *src_format,
...
@@ -62,7 +58,7 @@ PcmConvert::Convert16(const audio_format *src_format,
assert
(
dest_format
->
format
==
SAMPLE_FORMAT_S16
);
assert
(
dest_format
->
format
==
SAMPLE_FORMAT_S16
);
buf
=
pcm_convert_to_16
(
&
format_buffer
,
dither
,
buf
=
pcm_convert_to_16
(
format_buffer
,
dither
,
sample_format
(
src_format
->
format
),
sample_format
(
src_format
->
format
),
src_buffer
,
src_size
,
src_buffer
,
src_size
,
&
len
);
&
len
);
...
@@ -74,7 +70,7 @@ PcmConvert::Convert16(const audio_format *src_format,
...
@@ -74,7 +70,7 @@ PcmConvert::Convert16(const audio_format *src_format,
}
}
if
(
src_format
->
channels
!=
dest_format
->
channels
)
{
if
(
src_format
->
channels
!=
dest_format
->
channels
)
{
buf
=
pcm_convert_channels_16
(
&
channels_buffer
,
buf
=
pcm_convert_channels_16
(
channels_buffer
,
dest_format
->
channels
,
dest_format
->
channels
,
src_format
->
channels
,
src_format
->
channels
,
buf
,
len
,
&
len
);
buf
,
len
,
&
len
);
...
@@ -112,7 +108,7 @@ PcmConvert::Convert24(const audio_format *src_format,
...
@@ -112,7 +108,7 @@ PcmConvert::Convert24(const audio_format *src_format,
assert
(
dest_format
->
format
==
SAMPLE_FORMAT_S24_P32
);
assert
(
dest_format
->
format
==
SAMPLE_FORMAT_S24_P32
);
buf
=
pcm_convert_to_24
(
&
format_buffer
,
buf
=
pcm_convert_to_24
(
format_buffer
,
sample_format
(
src_format
->
format
),
sample_format
(
src_format
->
format
),
src_buffer
,
src_size
,
&
len
);
src_buffer
,
src_size
,
&
len
);
if
(
buf
==
NULL
)
{
if
(
buf
==
NULL
)
{
...
@@ -123,7 +119,7 @@ PcmConvert::Convert24(const audio_format *src_format,
...
@@ -123,7 +119,7 @@ PcmConvert::Convert24(const audio_format *src_format,
}
}
if
(
src_format
->
channels
!=
dest_format
->
channels
)
{
if
(
src_format
->
channels
!=
dest_format
->
channels
)
{
buf
=
pcm_convert_channels_24
(
&
channels_buffer
,
buf
=
pcm_convert_channels_24
(
channels_buffer
,
dest_format
->
channels
,
dest_format
->
channels
,
src_format
->
channels
,
src_format
->
channels
,
buf
,
len
,
&
len
);
buf
,
len
,
&
len
);
...
@@ -161,7 +157,7 @@ PcmConvert::Convert32(const audio_format *src_format,
...
@@ -161,7 +157,7 @@ PcmConvert::Convert32(const audio_format *src_format,
assert
(
dest_format
->
format
==
SAMPLE_FORMAT_S32
);
assert
(
dest_format
->
format
==
SAMPLE_FORMAT_S32
);
buf
=
pcm_convert_to_32
(
&
format_buffer
,
buf
=
pcm_convert_to_32
(
format_buffer
,
sample_format
(
src_format
->
format
),
sample_format
(
src_format
->
format
),
src_buffer
,
src_size
,
&
len
);
src_buffer
,
src_size
,
&
len
);
if
(
buf
==
NULL
)
{
if
(
buf
==
NULL
)
{
...
@@ -172,7 +168,7 @@ PcmConvert::Convert32(const audio_format *src_format,
...
@@ -172,7 +168,7 @@ PcmConvert::Convert32(const audio_format *src_format,
}
}
if
(
src_format
->
channels
!=
dest_format
->
channels
)
{
if
(
src_format
->
channels
!=
dest_format
->
channels
)
{
buf
=
pcm_convert_channels_32
(
&
channels_buffer
,
buf
=
pcm_convert_channels_32
(
channels_buffer
,
dest_format
->
channels
,
dest_format
->
channels
,
src_format
->
channels
,
src_format
->
channels
,
buf
,
len
,
&
len
);
buf
,
len
,
&
len
);
...
@@ -212,7 +208,7 @@ PcmConvert::ConvertFloat(const audio_format *src_format,
...
@@ -212,7 +208,7 @@ PcmConvert::ConvertFloat(const audio_format *src_format,
/* convert to float now */
/* convert to float now */
buffer
=
pcm_convert_to_float
(
&
format_buffer
,
buffer
=
pcm_convert_to_float
(
format_buffer
,
sample_format
(
src_format
->
format
),
sample_format
(
src_format
->
format
),
buffer
,
size
,
&
size
);
buffer
,
size
,
&
size
);
if
(
buffer
==
NULL
)
{
if
(
buffer
==
NULL
)
{
...
@@ -225,7 +221,7 @@ PcmConvert::ConvertFloat(const audio_format *src_format,
...
@@ -225,7 +221,7 @@ PcmConvert::ConvertFloat(const audio_format *src_format,
/* convert channels */
/* convert channels */
if
(
src_format
->
channels
!=
dest_format
->
channels
)
{
if
(
src_format
->
channels
!=
dest_format
->
channels
)
{
buffer
=
pcm_convert_channels_float
(
&
channels_buffer
,
buffer
=
pcm_convert_channels_float
(
channels_buffer
,
dest_format
->
channels
,
dest_format
->
channels
,
src_format
->
channels
,
src_format
->
channels
,
buffer
,
size
,
&
size
);
buffer
,
size
,
&
size
);
...
...
src/pcm/PcmConvert.hxx
View file @
c75cb67c
...
@@ -23,10 +23,7 @@
...
@@ -23,10 +23,7 @@
#include "PcmDither.hxx"
#include "PcmDither.hxx"
#include "PcmDsd.hxx"
#include "PcmDsd.hxx"
#include "PcmResample.hxx"
#include "PcmResample.hxx"
#include "PcmBuffer.hxx"
extern
"C"
{
#include "pcm_buffer.h"
}
#include <glib.h>
#include <glib.h>
...
@@ -45,10 +42,10 @@ class PcmConvert {
...
@@ -45,10 +42,10 @@ class PcmConvert {
PcmDither
dither
;
PcmDither
dither
;
/** the buffer for converting the sample format */
/** the buffer for converting the sample format */
struct
pcm_b
uffer
format_buffer
;
PcmB
uffer
format_buffer
;
/** the buffer for converting the channel count */
/** the buffer for converting the channel count */
struct
pcm_b
uffer
channels_buffer
;
PcmB
uffer
channels_buffer
;
public
:
public
:
PcmConvert
();
PcmConvert
();
...
...
src/pcm/PcmDsd.cxx
View file @
c75cb67c
...
@@ -29,15 +29,11 @@
...
@@ -29,15 +29,11 @@
PcmDsd
::
PcmDsd
()
PcmDsd
::
PcmDsd
()
{
{
pcm_buffer_init
(
&
buffer
);
std
::
fill_n
(
dsd2pcm
,
G_N_ELEMENTS
(
dsd2pcm
),
nullptr
);
std
::
fill_n
(
dsd2pcm
,
G_N_ELEMENTS
(
dsd2pcm
),
nullptr
);
}
}
PcmDsd
::~
PcmDsd
()
PcmDsd
::~
PcmDsd
()
{
{
pcm_buffer_deinit
(
&
buffer
);
for
(
unsigned
i
=
0
;
i
<
G_N_ELEMENTS
(
dsd2pcm
);
++
i
)
for
(
unsigned
i
=
0
;
i
<
G_N_ELEMENTS
(
dsd2pcm
);
++
i
)
if
(
dsd2pcm
[
i
]
!=
nullptr
)
if
(
dsd2pcm
[
i
]
!=
nullptr
)
dsd2pcm_destroy
(
dsd2pcm
[
i
]);
dsd2pcm_destroy
(
dsd2pcm
[
i
]);
...
@@ -67,7 +63,7 @@ PcmDsd::ToFloat(unsigned channels, bool lsbfirst,
...
@@ -67,7 +63,7 @@ PcmDsd::ToFloat(unsigned channels, bool lsbfirst,
float
*
dest
;
float
*
dest
;
const
size_t
dest_size
=
num_samples
*
sizeof
(
*
dest
);
const
size_t
dest_size
=
num_samples
*
sizeof
(
*
dest
);
*
dest_size_r
=
dest_size
;
*
dest_size_r
=
dest_size
;
dest
=
(
float
*
)
pcm_buffer_get
(
&
buffer
,
dest_size
);
dest
=
(
float
*
)
buffer
.
Get
(
dest_size
);
for
(
unsigned
c
=
0
;
c
<
channels
;
++
c
)
{
for
(
unsigned
c
=
0
;
c
<
channels
;
++
c
)
{
if
(
dsd2pcm
[
c
]
==
nullptr
)
{
if
(
dsd2pcm
[
c
]
==
nullptr
)
{
...
...
src/pcm/PcmDsd.hxx
View file @
c75cb67c
...
@@ -21,7 +21,7 @@
...
@@ -21,7 +21,7 @@
#define MPD_PCM_DSD_HXX
#define MPD_PCM_DSD_HXX
#include "check.h"
#include "check.h"
#include "
pcm_buffer.h
"
#include "
PcmBuffer.hxx
"
#include <stdint.h>
#include <stdint.h>
...
@@ -29,7 +29,7 @@
...
@@ -29,7 +29,7 @@
* Wrapper for the dsd2pcm library.
* Wrapper for the dsd2pcm library.
*/
*/
struct
PcmDsd
{
struct
PcmDsd
{
struct
pcm_b
uffer
buffer
;
PcmB
uffer
buffer
;
struct
dsd2pcm_ctx_s
*
dsd2pcm
[
32
];
struct
dsd2pcm_ctx_s
*
dsd2pcm
[
32
];
...
...
src/pcm/PcmDsdUsb.cxx
View file @
c75cb67c
...
@@ -19,7 +19,7 @@
...
@@ -19,7 +19,7 @@
#include "config.h"
#include "config.h"
#include "PcmDsdUsb.hxx"
#include "PcmDsdUsb.hxx"
#include "
pcm_buffer.h
"
#include "
PcmBuffer.hxx
"
#include "audio_format.h"
#include "audio_format.h"
G_GNUC_CONST
G_GNUC_CONST
...
@@ -38,11 +38,10 @@ pcm_two_dsd_to_usb_marker2(uint8_t a, uint8_t b)
...
@@ -38,11 +38,10 @@ pcm_two_dsd_to_usb_marker2(uint8_t a, uint8_t b)
const
uint32_t
*
const
uint32_t
*
pcm_dsd_to_usb
(
struct
pcm_buffer
*
buffer
,
unsigned
channels
,
pcm_dsd_to_usb
(
PcmBuffer
&
buffer
,
unsigned
channels
,
const
uint8_t
*
src
,
size_t
src_size
,
const
uint8_t
*
src
,
size_t
src_size
,
size_t
*
dest_size_r
)
size_t
*
dest_size_r
)
{
{
assert
(
buffer
!=
NULL
);
assert
(
audio_valid_channel_count
(
channels
));
assert
(
audio_valid_channel_count
(
channels
));
assert
(
src
!=
NULL
);
assert
(
src
!=
NULL
);
assert
(
src_size
>
0
);
assert
(
src_size
>
0
);
...
@@ -58,7 +57,7 @@ pcm_dsd_to_usb(struct pcm_buffer *buffer, unsigned channels,
...
@@ -58,7 +57,7 @@ pcm_dsd_to_usb(struct pcm_buffer *buffer, unsigned channels,
const
size_t
dest_size
=
num_samples
*
4
;
const
size_t
dest_size
=
num_samples
*
4
;
*
dest_size_r
=
dest_size
;
*
dest_size_r
=
dest_size
;
uint32_t
*
const
dest0
=
(
uint32_t
*
)
pcm_buffer_get
(
buffer
,
dest_size
),
uint32_t
*
const
dest0
=
(
uint32_t
*
)
buffer
.
Get
(
dest_size
),
*
dest
=
dest0
;
*
dest
=
dest0
;
for
(
unsigned
i
=
num_frames
/
2
;
i
>
0
;
--
i
)
{
for
(
unsigned
i
=
num_frames
/
2
;
i
>
0
;
--
i
)
{
...
...
src/pcm/PcmDsdUsb.hxx
View file @
c75cb67c
...
@@ -25,7 +25,7 @@
...
@@ -25,7 +25,7 @@
#include <stdint.h>
#include <stdint.h>
#include <stddef.h>
#include <stddef.h>
struct
pcm_b
uffer
;
struct
PcmB
uffer
;
/**
/**
* Pack DSD 1 bit samples into (padded) 24 bit PCM samples for
* Pack DSD 1 bit samples into (padded) 24 bit PCM samples for
...
@@ -34,7 +34,7 @@ struct pcm_buffer;
...
@@ -34,7 +34,7 @@ struct pcm_buffer;
* http://www.sonore.us/DoP_openStandard_1v1.pdf
* http://www.sonore.us/DoP_openStandard_1v1.pdf
*/
*/
const
uint32_t
*
const
uint32_t
*
pcm_dsd_to_usb
(
struct
pcm_buffer
*
buffer
,
unsigned
channels
,
pcm_dsd_to_usb
(
PcmBuffer
&
buffer
,
unsigned
channels
,
const
uint8_t
*
src
,
size_t
src_size
,
const
uint8_t
*
src
,
size_t
src_size
,
size_t
*
dest_size_r
);
size_t
*
dest_size_r
);
...
...
src/pcm/PcmExport.cxx
View file @
c75cb67c
...
@@ -78,7 +78,7 @@ const void *
...
@@ -78,7 +78,7 @@ const void *
PcmExport
::
Export
(
const
void
*
data
,
size_t
size
,
size_t
&
dest_size_r
)
PcmExport
::
Export
(
const
void
*
data
,
size_t
size
,
size_t
&
dest_size_r
)
{
{
if
(
dsd_usb
)
if
(
dsd_usb
)
data
=
pcm_dsd_to_usb
(
&
dsd_buffer
,
channels
,
data
=
pcm_dsd_to_usb
(
dsd_buffer
,
channels
,
(
const
uint8_t
*
)
data
,
size
,
&
size
);
(
const
uint8_t
*
)
data
,
size
,
&
size
);
if
(
pack24
)
{
if
(
pack24
)
{
...
@@ -89,8 +89,7 @@ PcmExport::Export(const void *data, size_t size, size_t &dest_size_r)
...
@@ -89,8 +89,7 @@ PcmExport::Export(const void *data, size_t size, size_t &dest_size_r)
const
uint8_t
*
src8
=
(
const
uint8_t
*
)
data
;
const
uint8_t
*
src8
=
(
const
uint8_t
*
)
data
;
const
uint8_t
*
src_end8
=
src8
+
size
;
const
uint8_t
*
src_end8
=
src8
+
size
;
uint8_t
*
dest
=
(
uint8_t
*
)
uint8_t
*
dest
=
(
uint8_t
*
)
pack_buffer
.
Get
(
dest_size
);
pcm_buffer_get
(
&
pack_buffer
,
dest_size
);
assert
(
dest
!=
NULL
);
assert
(
dest
!=
NULL
);
pcm_pack_24
(
dest
,
(
const
int32_t
*
)
src8
,
pcm_pack_24
(
dest
,
(
const
int32_t
*
)
src8
,
...
@@ -106,8 +105,7 @@ PcmExport::Export(const void *data, size_t size, size_t &dest_size_r)
...
@@ -106,8 +105,7 @@ PcmExport::Export(const void *data, size_t size, size_t &dest_size_r)
const
uint32_t
*
src
=
(
const
uint32_t
*
)
src8
;
const
uint32_t
*
src
=
(
const
uint32_t
*
)
src8
;
const
uint32_t
*
const
src_end
=
(
const
uint32_t
*
)
src_end8
;
const
uint32_t
*
const
src_end
=
(
const
uint32_t
*
)
src_end8
;
uint32_t
*
dest
=
(
uint32_t
*
)
uint32_t
*
dest
=
(
uint32_t
*
)
pack_buffer
.
Get
(
size
);
pcm_buffer_get
(
&
pack_buffer
,
size
);
data
=
dest
;
data
=
dest
;
while
(
src
<
src_end
)
while
(
src
<
src_end
)
...
@@ -118,8 +116,7 @@ PcmExport::Export(const void *data, size_t size, size_t &dest_size_r)
...
@@ -118,8 +116,7 @@ PcmExport::Export(const void *data, size_t size, size_t &dest_size_r)
if
(
reverse_endian
>
0
)
{
if
(
reverse_endian
>
0
)
{
assert
(
reverse_endian
>=
2
);
assert
(
reverse_endian
>=
2
);
uint8_t
*
dest
=
(
uint8_t
*
)
uint8_t
*
dest
=
(
uint8_t
*
)
reverse_buffer
.
Get
(
size
);
pcm_buffer_get
(
&
reverse_buffer
,
size
);
assert
(
dest
!=
NULL
);
assert
(
dest
!=
NULL
);
const
uint8_t
*
src
=
(
const
uint8_t
*
)
data
;
const
uint8_t
*
src
=
(
const
uint8_t
*
)
data
;
...
...
src/pcm/PcmExport.hxx
View file @
c75cb67c
...
@@ -21,7 +21,7 @@
...
@@ -21,7 +21,7 @@
#define PCM_EXPORT_HXX
#define PCM_EXPORT_HXX
#include "check.h"
#include "check.h"
#include "
pcm_buffer.h
"
#include "
PcmBuffer.hxx
"
#include "audio_format.h"
#include "audio_format.h"
struct
audio_format
;
struct
audio_format
;
...
@@ -38,21 +38,21 @@ struct PcmExport {
...
@@ -38,21 +38,21 @@ struct PcmExport {
*
*
* @see #dsd_usb
* @see #dsd_usb
*/
*/
struct
pcm_b
uffer
dsd_buffer
;
PcmB
uffer
dsd_buffer
;
/**
/**
* The buffer is used to pack samples, removing padding.
* The buffer is used to pack samples, removing padding.
*
*
* @see #pack24
* @see #pack24
*/
*/
struct
pcm_b
uffer
pack_buffer
;
PcmB
uffer
pack_buffer
;
/**
/**
* The buffer is used to reverse the byte order.
* The buffer is used to reverse the byte order.
*
*
* @see #reverse_endian
* @see #reverse_endian
*/
*/
struct
pcm_b
uffer
reverse_buffer
;
PcmB
uffer
reverse_buffer
;
/**
/**
* The number of channels.
* The number of channels.
...
@@ -84,18 +84,6 @@ struct PcmExport {
...
@@ -84,18 +84,6 @@ struct PcmExport {
*/
*/
uint8_t
reverse_endian
;
uint8_t
reverse_endian
;
PcmExport
()
{
pcm_buffer_init
(
&
reverse_buffer
);
pcm_buffer_init
(
&
pack_buffer
);
pcm_buffer_init
(
&
dsd_buffer
);
}
~
PcmExport
()
{
pcm_buffer_deinit
(
&
reverse_buffer
);
pcm_buffer_deinit
(
&
pack_buffer
);
pcm_buffer_deinit
(
&
dsd_buffer
);
}
/**
/**
* Open the #pcm_export_state object.
* Open the #pcm_export_state object.
*
*
...
...
src/pcm/PcmFormat.cxx
View file @
c75cb67c
...
@@ -20,7 +20,7 @@
...
@@ -20,7 +20,7 @@
#include "config.h"
#include "config.h"
#include "PcmFormat.hxx"
#include "PcmFormat.hxx"
#include "PcmDither.hxx"
#include "PcmDither.hxx"
#include "
pcm_buffer.h
"
#include "
PcmBuffer.hxx
"
#include "pcm_pack.h"
#include "pcm_pack.h"
#include "PcmUtils.hxx"
#include "PcmUtils.hxx"
...
@@ -80,7 +80,7 @@ ConvertFromFloat(S dest, const float *src, size_t size)
...
@@ -80,7 +80,7 @@ ConvertFromFloat(S dest, const float *src, size_t size)
template
<
typename
S
,
unsigned
bits
=
sizeof
(
S
)
*
8
>
template
<
typename
S
,
unsigned
bits
=
sizeof
(
S
)
*
8
>
static
S
*
static
S
*
AllocateFromFloat
(
pcm_b
uffer
&
buffer
,
const
float
*
src
,
size_t
src_size
,
AllocateFromFloat
(
PcmB
uffer
&
buffer
,
const
float
*
src
,
size_t
src_size
,
size_t
*
dest_size_r
)
size_t
*
dest_size_r
)
{
{
constexpr
size_t
src_sample_size
=
sizeof
(
*
src
);
constexpr
size_t
src_sample_size
=
sizeof
(
*
src
);
...
@@ -88,60 +88,60 @@ AllocateFromFloat(pcm_buffer &buffer, const float *src, size_t src_size,
...
@@ -88,60 +88,60 @@ AllocateFromFloat(pcm_buffer &buffer, const float *src, size_t src_size,
const
size_t
num_samples
=
src_size
/
src_sample_size
;
const
size_t
num_samples
=
src_size
/
src_sample_size
;
*
dest_size_r
=
num_samples
*
sizeof
(
S
);
*
dest_size_r
=
num_samples
*
sizeof
(
S
);
S
*
dest
=
(
S
*
)
pcm_buffer_get
(
&
buffer
,
*
dest_size_r
);
S
*
dest
=
(
S
*
)
buffer
.
Get
(
*
dest_size_r
);
ConvertFromFloat
<
S
*
,
bits
>
(
dest
,
src
,
src_size
);
ConvertFromFloat
<
S
*
,
bits
>
(
dest
,
src
,
src_size
);
return
dest
;
return
dest
;
}
}
static
int16_t
*
static
int16_t
*
pcm_allocate_8_to_16
(
struct
pcm_buffer
*
buffer
,
pcm_allocate_8_to_16
(
PcmBuffer
&
buffer
,
const
int8_t
*
src
,
size_t
src_size
,
size_t
*
dest_size_r
)
const
int8_t
*
src
,
size_t
src_size
,
size_t
*
dest_size_r
)
{
{
int16_t
*
dest
;
int16_t
*
dest
;
*
dest_size_r
=
src_size
/
sizeof
(
*
src
)
*
sizeof
(
*
dest
);
*
dest_size_r
=
src_size
/
sizeof
(
*
src
)
*
sizeof
(
*
dest
);
dest
=
(
int16_t
*
)
pcm_buffer_get
(
buffer
,
*
dest_size_r
);
dest
=
(
int16_t
*
)
buffer
.
Get
(
*
dest_size_r
);
pcm_convert_8_to_16
(
dest
,
src
,
pcm_end_pointer
(
src
,
src_size
));
pcm_convert_8_to_16
(
dest
,
src
,
pcm_end_pointer
(
src
,
src_size
));
return
dest
;
return
dest
;
}
}
static
int16_t
*
static
int16_t
*
pcm_allocate_24p32_to_16
(
struct
pcm_buffer
*
buffer
,
PcmDither
&
dither
,
pcm_allocate_24p32_to_16
(
PcmBuffer
&
buffer
,
PcmDither
&
dither
,
const
int32_t
*
src
,
size_t
src_size
,
const
int32_t
*
src
,
size_t
src_size
,
size_t
*
dest_size_r
)
size_t
*
dest_size_r
)
{
{
int16_t
*
dest
;
int16_t
*
dest
;
*
dest_size_r
=
src_size
/
2
;
*
dest_size_r
=
src_size
/
2
;
assert
(
*
dest_size_r
==
src_size
/
sizeof
(
*
src
)
*
sizeof
(
*
dest
));
assert
(
*
dest_size_r
==
src_size
/
sizeof
(
*
src
)
*
sizeof
(
*
dest
));
dest
=
(
int16_t
*
)
pcm_buffer_get
(
buffer
,
*
dest_size_r
);
dest
=
(
int16_t
*
)
buffer
.
Get
(
*
dest_size_r
);
pcm_convert_24_to_16
(
dither
,
dest
,
src
,
pcm_convert_24_to_16
(
dither
,
dest
,
src
,
pcm_end_pointer
(
src
,
src_size
));
pcm_end_pointer
(
src
,
src_size
));
return
dest
;
return
dest
;
}
}
static
int16_t
*
static
int16_t
*
pcm_allocate_32_to_16
(
struct
pcm_buffer
*
buffer
,
PcmDither
&
dither
,
pcm_allocate_32_to_16
(
PcmBuffer
&
buffer
,
PcmDither
&
dither
,
const
int32_t
*
src
,
size_t
src_size
,
const
int32_t
*
src
,
size_t
src_size
,
size_t
*
dest_size_r
)
size_t
*
dest_size_r
)
{
{
int16_t
*
dest
;
int16_t
*
dest
;
*
dest_size_r
=
src_size
/
2
;
*
dest_size_r
=
src_size
/
2
;
assert
(
*
dest_size_r
==
src_size
/
sizeof
(
*
src
)
*
sizeof
(
*
dest
));
assert
(
*
dest_size_r
==
src_size
/
sizeof
(
*
src
)
*
sizeof
(
*
dest
));
dest
=
(
int16_t
*
)
pcm_buffer_get
(
buffer
,
*
dest_size_r
);
dest
=
(
int16_t
*
)
buffer
.
Get
(
*
dest_size_r
);
pcm_convert_32_to_16
(
dither
,
dest
,
src
,
pcm_convert_32_to_16
(
dither
,
dest
,
src
,
pcm_end_pointer
(
src
,
src_size
));
pcm_end_pointer
(
src
,
src_size
));
return
dest
;
return
dest
;
}
}
static
int16_t
*
static
int16_t
*
pcm_allocate_float_to_16
(
struct
pcm_buffer
*
buffer
,
pcm_allocate_float_to_16
(
PcmBuffer
&
buffer
,
const
float
*
src
,
size_t
src_size
,
const
float
*
src
,
size_t
src_size
,
size_t
*
dest_size_r
)
size_t
*
dest_size_r
)
{
{
return
AllocateFromFloat
<
int16_t
>
(
*
buffer
,
src
,
src_size
,
dest_size_r
);
return
AllocateFromFloat
<
int16_t
>
(
buffer
,
src
,
src_size
,
dest_size_r
);
}
}
const
int16_t
*
const
int16_t
*
pcm_convert_to_16
(
struct
pcm_buffer
*
buffer
,
PcmDither
&
dither
,
pcm_convert_to_16
(
PcmBuffer
&
buffer
,
PcmDither
&
dither
,
enum
sample_format
src_format
,
const
void
*
src
,
enum
sample_format
src_format
,
const
void
*
src
,
size_t
src_size
,
size_t
*
dest_size_r
)
size_t
src_size
,
size_t
*
dest_size_r
)
{
{
...
@@ -204,49 +204,49 @@ pcm_convert_32_to_24(int32_t *restrict out,
...
@@ -204,49 +204,49 @@ pcm_convert_32_to_24(int32_t *restrict out,
}
}
static
int32_t
*
static
int32_t
*
pcm_allocate_8_to_24
(
struct
pcm_buffer
*
buffer
,
pcm_allocate_8_to_24
(
PcmBuffer
&
buffer
,
const
int8_t
*
src
,
size_t
src_size
,
size_t
*
dest_size_r
)
const
int8_t
*
src
,
size_t
src_size
,
size_t
*
dest_size_r
)
{
{
int32_t
*
dest
;
int32_t
*
dest
;
*
dest_size_r
=
src_size
/
sizeof
(
*
src
)
*
sizeof
(
*
dest
);
*
dest_size_r
=
src_size
/
sizeof
(
*
src
)
*
sizeof
(
*
dest
);
dest
=
(
int32_t
*
)
pcm_buffer_get
(
buffer
,
*
dest_size_r
);
dest
=
(
int32_t
*
)
buffer
.
Get
(
*
dest_size_r
);
pcm_convert_8_to_24
(
dest
,
src
,
pcm_end_pointer
(
src
,
src_size
));
pcm_convert_8_to_24
(
dest
,
src
,
pcm_end_pointer
(
src
,
src_size
));
return
dest
;
return
dest
;
}
}
static
int32_t
*
static
int32_t
*
pcm_allocate_16_to_24
(
struct
pcm_buffer
*
buffer
,
pcm_allocate_16_to_24
(
PcmBuffer
&
buffer
,
const
int16_t
*
src
,
size_t
src_size
,
size_t
*
dest_size_r
)
const
int16_t
*
src
,
size_t
src_size
,
size_t
*
dest_size_r
)
{
{
int32_t
*
dest
;
int32_t
*
dest
;
*
dest_size_r
=
src_size
*
2
;
*
dest_size_r
=
src_size
*
2
;
assert
(
*
dest_size_r
==
src_size
/
sizeof
(
*
src
)
*
sizeof
(
*
dest
));
assert
(
*
dest_size_r
==
src_size
/
sizeof
(
*
src
)
*
sizeof
(
*
dest
));
dest
=
(
int32_t
*
)
pcm_buffer_get
(
buffer
,
*
dest_size_r
);
dest
=
(
int32_t
*
)
buffer
.
Get
(
*
dest_size_r
);
pcm_convert_16_to_24
(
dest
,
src
,
pcm_end_pointer
(
src
,
src_size
));
pcm_convert_16_to_24
(
dest
,
src
,
pcm_end_pointer
(
src
,
src_size
));
return
dest
;
return
dest
;
}
}
static
int32_t
*
static
int32_t
*
pcm_allocate_32_to_24
(
struct
pcm_buffer
*
buffer
,
pcm_allocate_32_to_24
(
PcmBuffer
&
buffer
,
const
int32_t
*
src
,
size_t
src_size
,
size_t
*
dest_size_r
)
const
int32_t
*
src
,
size_t
src_size
,
size_t
*
dest_size_r
)
{
{
*
dest_size_r
=
src_size
;
*
dest_size_r
=
src_size
;
int32_t
*
dest
=
(
int32_t
*
)
pcm_buffer_get
(
buffer
,
*
dest_size_r
);
int32_t
*
dest
=
(
int32_t
*
)
buffer
.
Get
(
*
dest_size_r
);
pcm_convert_32_to_24
(
dest
,
src
,
pcm_end_pointer
(
src
,
src_size
));
pcm_convert_32_to_24
(
dest
,
src
,
pcm_end_pointer
(
src
,
src_size
));
return
dest
;
return
dest
;
}
}
static
int32_t
*
static
int32_t
*
pcm_allocate_float_to_24
(
struct
pcm_buffer
*
buffer
,
pcm_allocate_float_to_24
(
PcmBuffer
&
buffer
,
const
float
*
src
,
size_t
src_size
,
const
float
*
src
,
size_t
src_size
,
size_t
*
dest_size_r
)
size_t
*
dest_size_r
)
{
{
return
AllocateFromFloat
<
int32_t
,
24
>
(
*
buffer
,
src
,
src_size
,
return
AllocateFromFloat
<
int32_t
,
24
>
(
buffer
,
src
,
src_size
,
dest_size_r
);
dest_size_r
);
}
}
const
int32_t
*
const
int32_t
*
pcm_convert_to_24
(
struct
pcm_buffer
*
buffer
,
pcm_convert_to_24
(
PcmBuffer
&
buffer
,
enum
sample_format
src_format
,
const
void
*
src
,
enum
sample_format
src_format
,
const
void
*
src
,
size_t
src_size
,
size_t
*
dest_size_r
)
size_t
src_size
,
size_t
*
dest_size_r
)
{
{
...
@@ -309,41 +309,41 @@ pcm_convert_24_to_32(int32_t *restrict out,
...
@@ -309,41 +309,41 @@ pcm_convert_24_to_32(int32_t *restrict out,
}
}
static
int32_t
*
static
int32_t
*
pcm_allocate_8_to_32
(
struct
pcm_buffer
*
buffer
,
pcm_allocate_8_to_32
(
PcmBuffer
&
buffer
,
const
int8_t
*
src
,
size_t
src_size
,
size_t
*
dest_size_r
)
const
int8_t
*
src
,
size_t
src_size
,
size_t
*
dest_size_r
)
{
{
int32_t
*
dest
;
int32_t
*
dest
;
*
dest_size_r
=
src_size
/
sizeof
(
*
src
)
*
sizeof
(
*
dest
);
*
dest_size_r
=
src_size
/
sizeof
(
*
src
)
*
sizeof
(
*
dest
);
dest
=
(
int32_t
*
)
pcm_buffer_get
(
buffer
,
*
dest_size_r
);
dest
=
(
int32_t
*
)
buffer
.
Get
(
*
dest_size_r
);
pcm_convert_8_to_32
(
dest
,
src
,
pcm_end_pointer
(
src
,
src_size
));
pcm_convert_8_to_32
(
dest
,
src
,
pcm_end_pointer
(
src
,
src_size
));
return
dest
;
return
dest
;
}
}
static
int32_t
*
static
int32_t
*
pcm_allocate_16_to_32
(
struct
pcm_buffer
*
buffer
,
pcm_allocate_16_to_32
(
PcmBuffer
&
buffer
,
const
int16_t
*
src
,
size_t
src_size
,
size_t
*
dest_size_r
)
const
int16_t
*
src
,
size_t
src_size
,
size_t
*
dest_size_r
)
{
{
int32_t
*
dest
;
int32_t
*
dest
;
*
dest_size_r
=
src_size
*
2
;
*
dest_size_r
=
src_size
*
2
;
assert
(
*
dest_size_r
==
src_size
/
sizeof
(
*
src
)
*
sizeof
(
*
dest
));
assert
(
*
dest_size_r
==
src_size
/
sizeof
(
*
src
)
*
sizeof
(
*
dest
));
dest
=
(
int32_t
*
)
pcm_buffer_get
(
buffer
,
*
dest_size_r
);
dest
=
(
int32_t
*
)
buffer
.
Get
(
*
dest_size_r
);
pcm_convert_16_to_32
(
dest
,
src
,
pcm_end_pointer
(
src
,
src_size
));
pcm_convert_16_to_32
(
dest
,
src
,
pcm_end_pointer
(
src
,
src_size
));
return
dest
;
return
dest
;
}
}
static
int32_t
*
static
int32_t
*
pcm_allocate_24p32_to_32
(
struct
pcm_buffer
*
buffer
,
pcm_allocate_24p32_to_32
(
PcmBuffer
&
buffer
,
const
int32_t
*
src
,
size_t
src_size
,
const
int32_t
*
src
,
size_t
src_size
,
size_t
*
dest_size_r
)
size_t
*
dest_size_r
)
{
{
*
dest_size_r
=
src_size
;
*
dest_size_r
=
src_size
;
int32_t
*
dest
=
(
int32_t
*
)
pcm_buffer_get
(
buffer
,
*
dest_size_r
);
int32_t
*
dest
=
(
int32_t
*
)
buffer
.
Get
(
*
dest_size_r
);
pcm_convert_24_to_32
(
dest
,
src
,
pcm_end_pointer
(
src
,
src_size
));
pcm_convert_24_to_32
(
dest
,
src
,
pcm_end_pointer
(
src
,
src_size
));
return
dest
;
return
dest
;
}
}
static
int32_t
*
static
int32_t
*
pcm_allocate_float_to_32
(
struct
pcm_buffer
*
buffer
,
pcm_allocate_float_to_32
(
PcmBuffer
&
buffer
,
const
float
*
src
,
size_t
src_size
,
const
float
*
src
,
size_t
src_size
,
size_t
*
dest_size_r
)
size_t
*
dest_size_r
)
{
{
...
@@ -357,7 +357,7 @@ pcm_allocate_float_to_32(struct pcm_buffer *buffer,
...
@@ -357,7 +357,7 @@ pcm_allocate_float_to_32(struct pcm_buffer *buffer,
}
}
const
int32_t
*
const
int32_t
*
pcm_convert_to_32
(
struct
pcm_buffer
*
buffer
,
pcm_convert_to_32
(
PcmBuffer
&
buffer
,
enum
sample_format
src_format
,
const
void
*
src
,
enum
sample_format
src_format
,
const
void
*
src
,
size_t
src_size
,
size_t
*
dest_size_r
)
size_t
src_size
,
size_t
*
dest_size_r
)
{
{
...
@@ -415,7 +415,7 @@ ConvertToFloat(float *dest, S src, size_t size)
...
@@ -415,7 +415,7 @@ ConvertToFloat(float *dest, S src, size_t size)
template
<
typename
S
,
unsigned
bits
=
DefaultSampleBits
<
S
>::
value
>
template
<
typename
S
,
unsigned
bits
=
DefaultSampleBits
<
S
>::
value
>
static
float
*
static
float
*
AllocateToFloat
(
pcm_b
uffer
&
buffer
,
S
src
,
size_t
src_size
,
AllocateToFloat
(
PcmB
uffer
&
buffer
,
S
src
,
size_t
src_size
,
size_t
*
dest_size_r
)
size_t
*
dest_size_r
)
{
{
constexpr
size_t
src_sample_size
=
sizeof
(
*
S
());
constexpr
size_t
src_sample_size
=
sizeof
(
*
S
());
...
@@ -423,46 +423,46 @@ AllocateToFloat(pcm_buffer &buffer, S src, size_t src_size,
...
@@ -423,46 +423,46 @@ AllocateToFloat(pcm_buffer &buffer, S src, size_t src_size,
const
size_t
num_samples
=
src_size
/
src_sample_size
;
const
size_t
num_samples
=
src_size
/
src_sample_size
;
*
dest_size_r
=
num_samples
*
sizeof
(
float
);
*
dest_size_r
=
num_samples
*
sizeof
(
float
);
float
*
dest
=
(
float
*
)
pcm_buffer_get
(
&
buffer
,
*
dest_size_r
);
float
*
dest
=
(
float
*
)
buffer
.
Get
(
*
dest_size_r
);
ConvertToFloat
<
S
,
bits
>
(
dest
,
src
,
src_size
);
ConvertToFloat
<
S
,
bits
>
(
dest
,
src
,
src_size
);
return
dest
;
return
dest
;
}
}
static
float
*
static
float
*
pcm_allocate_8_to_float
(
struct
pcm_buffer
*
buffer
,
pcm_allocate_8_to_float
(
PcmBuffer
&
buffer
,
const
int8_t
*
src
,
size_t
src_size
,
const
int8_t
*
src
,
size_t
src_size
,
size_t
*
dest_size_r
)
size_t
*
dest_size_r
)
{
{
return
AllocateToFloat
(
*
buffer
,
src
,
src_size
,
dest_size_r
);
return
AllocateToFloat
(
buffer
,
src
,
src_size
,
dest_size_r
);
}
}
static
float
*
static
float
*
pcm_allocate_16_to_float
(
struct
pcm_buffer
*
buffer
,
pcm_allocate_16_to_float
(
PcmBuffer
&
buffer
,
const
int16_t
*
src
,
size_t
src_size
,
const
int16_t
*
src
,
size_t
src_size
,
size_t
*
dest_size_r
)
size_t
*
dest_size_r
)
{
{
return
AllocateToFloat
(
*
buffer
,
src
,
src_size
,
dest_size_r
);
return
AllocateToFloat
(
buffer
,
src
,
src_size
,
dest_size_r
);
}
}
static
float
*
static
float
*
pcm_allocate_24p32_to_float
(
struct
pcm_buffer
*
buffer
,
pcm_allocate_24p32_to_float
(
PcmBuffer
&
buffer
,
const
int32_t
*
src
,
size_t
src_size
,
const
int32_t
*
src
,
size_t
src_size
,
size_t
*
dest_size_r
)
size_t
*
dest_size_r
)
{
{
return
AllocateToFloat
<
decltype
(
src
),
24
>
return
AllocateToFloat
<
decltype
(
src
),
24
>
(
*
buffer
,
src
,
src_size
,
dest_size_r
);
(
buffer
,
src
,
src_size
,
dest_size_r
);
}
}
static
float
*
static
float
*
pcm_allocate_32_to_float
(
struct
pcm_buffer
*
buffer
,
pcm_allocate_32_to_float
(
PcmBuffer
&
buffer
,
const
int32_t
*
src
,
size_t
src_size
,
const
int32_t
*
src
,
size_t
src_size
,
size_t
*
dest_size_r
)
size_t
*
dest_size_r
)
{
{
return
AllocateToFloat
(
*
buffer
,
src
,
src_size
,
dest_size_r
);
return
AllocateToFloat
(
buffer
,
src
,
src_size
,
dest_size_r
);
}
}
const
float
*
const
float
*
pcm_convert_to_float
(
struct
pcm_buffer
*
buffer
,
pcm_convert_to_float
(
PcmBuffer
&
buffer
,
enum
sample_format
src_format
,
const
void
*
src
,
enum
sample_format
src_format
,
const
void
*
src
,
size_t
src_size
,
size_t
*
dest_size_r
)
size_t
src_size
,
size_t
*
dest_size_r
)
{
{
...
...
src/pcm/PcmFormat.hxx
View file @
c75cb67c
...
@@ -25,14 +25,14 @@
...
@@ -25,14 +25,14 @@
#include <stdint.h>
#include <stdint.h>
#include <stddef.h>
#include <stddef.h>
struct
pcm_b
uffer
;
struct
PcmB
uffer
;
class
PcmDither
;
class
PcmDither
;
/**
/**
* Converts PCM samples to 16 bit. If the source format is 24 bit,
* Converts PCM samples to 16 bit. If the source format is 24 bit,
* then dithering is applied.
* then dithering is applied.
*
*
* @param buffer a
pcm_b
uffer object
* @param buffer a
PcmB
uffer object
* @param dither a pcm_dither object for 24-to-16 conversion
* @param dither a pcm_dither object for 24-to-16 conversion
* @param bits the number of in the source buffer
* @param bits the number of in the source buffer
* @param src the source PCM buffer
* @param src the source PCM buffer
...
@@ -41,14 +41,14 @@ class PcmDither;
...
@@ -41,14 +41,14 @@ class PcmDither;
* @return the destination buffer
* @return the destination buffer
*/
*/
const
int16_t
*
const
int16_t
*
pcm_convert_to_16
(
struct
pcm_buffer
*
buffer
,
PcmDither
&
dither
,
pcm_convert_to_16
(
PcmBuffer
&
buffer
,
PcmDither
&
dither
,
enum
sample_format
src_format
,
const
void
*
src
,
enum
sample_format
src_format
,
const
void
*
src
,
size_t
src_size
,
size_t
*
dest_size_r
);
size_t
src_size
,
size_t
*
dest_size_r
);
/**
/**
* Converts PCM samples to 24 bit (32 bit alignment).
* Converts PCM samples to 24 bit (32 bit alignment).
*
*
* @param buffer a
pcm_b
uffer object
* @param buffer a
PcmB
uffer object
* @param bits the number of in the source buffer
* @param bits the number of in the source buffer
* @param src the source PCM buffer
* @param src the source PCM buffer
* @param src_size the size of #src in bytes
* @param src_size the size of #src in bytes
...
@@ -56,14 +56,14 @@ pcm_convert_to_16(struct pcm_buffer *buffer, PcmDither &dither,
...
@@ -56,14 +56,14 @@ pcm_convert_to_16(struct pcm_buffer *buffer, PcmDither &dither,
* @return the destination buffer
* @return the destination buffer
*/
*/
const
int32_t
*
const
int32_t
*
pcm_convert_to_24
(
struct
pcm_buffer
*
buffer
,
pcm_convert_to_24
(
PcmBuffer
&
buffer
,
enum
sample_format
src_format
,
const
void
*
src
,
enum
sample_format
src_format
,
const
void
*
src
,
size_t
src_size
,
size_t
*
dest_size_r
);
size_t
src_size
,
size_t
*
dest_size_r
);
/**
/**
* Converts PCM samples to 32 bit.
* Converts PCM samples to 32 bit.
*
*
* @param buffer a
pcm_b
uffer object
* @param buffer a
PcmB
uffer object
* @param bits the number of in the source buffer
* @param bits the number of in the source buffer
* @param src the source PCM buffer
* @param src the source PCM buffer
* @param src_size the size of #src in bytes
* @param src_size the size of #src in bytes
...
@@ -71,14 +71,14 @@ pcm_convert_to_24(struct pcm_buffer *buffer,
...
@@ -71,14 +71,14 @@ pcm_convert_to_24(struct pcm_buffer *buffer,
* @return the destination buffer
* @return the destination buffer
*/
*/
const
int32_t
*
const
int32_t
*
pcm_convert_to_32
(
struct
pcm_buffer
*
buffer
,
pcm_convert_to_32
(
PcmBuffer
&
buffer
,
enum
sample_format
src_format
,
const
void
*
src
,
enum
sample_format
src_format
,
const
void
*
src
,
size_t
src_size
,
size_t
*
dest_size_r
);
size_t
src_size
,
size_t
*
dest_size_r
);
/**
/**
* Converts PCM samples to 32 bit floating point.
* Converts PCM samples to 32 bit floating point.
*
*
* @param buffer a
pcm_b
uffer object
* @param buffer a
PcmB
uffer object
* @param bits the number of in the source buffer
* @param bits the number of in the source buffer
* @param src the source PCM buffer
* @param src the source PCM buffer
* @param src_size the size of #src in bytes
* @param src_size the size of #src in bytes
...
@@ -86,7 +86,7 @@ pcm_convert_to_32(struct pcm_buffer *buffer,
...
@@ -86,7 +86,7 @@ pcm_convert_to_32(struct pcm_buffer *buffer,
* @return the destination buffer
* @return the destination buffer
*/
*/
const
float
*
const
float
*
pcm_convert_to_float
(
struct
pcm_buffer
*
buffer
,
pcm_convert_to_float
(
PcmBuffer
&
buffer
,
enum
sample_format
src_format
,
const
void
*
src
,
enum
sample_format
src_format
,
const
void
*
src
,
size_t
src_size
,
size_t
*
dest_size_r
);
size_t
src_size
,
size_t
*
dest_size_r
);
...
...
src/pcm/PcmResample.cxx
View file @
c75cb67c
...
@@ -61,9 +61,7 @@ PcmResampler::PcmResampler()
...
@@ -61,9 +61,7 @@ PcmResampler::PcmResampler()
#ifdef HAVE_LIBSAMPLERATE
#ifdef HAVE_LIBSAMPLERATE
if
(
pcm_resample_lsr_enabled
())
if
(
pcm_resample_lsr_enabled
())
pcm_resample_lsr_init
(
this
);
pcm_resample_lsr_init
(
this
);
else
#endif
#endif
pcm_resample_fallback_init
(
this
);
}
}
PcmResampler
::~
PcmResampler
()
PcmResampler
::~
PcmResampler
()
...
@@ -71,9 +69,7 @@ PcmResampler::~PcmResampler()
...
@@ -71,9 +69,7 @@ PcmResampler::~PcmResampler()
#ifdef HAVE_LIBSAMPLERATE
#ifdef HAVE_LIBSAMPLERATE
if
(
pcm_resample_lsr_enabled
())
if
(
pcm_resample_lsr_enabled
())
pcm_resample_lsr_deinit
(
this
);
pcm_resample_lsr_deinit
(
this
);
else
#endif
#endif
pcm_resample_fallback_deinit
(
this
);
}
}
void
void
...
...
src/pcm/PcmResample.hxx
View file @
c75cb67c
...
@@ -21,7 +21,7 @@
...
@@ -21,7 +21,7 @@
#define MPD_PCM_RESAMPLE_HXX
#define MPD_PCM_RESAMPLE_HXX
#include "check.h"
#include "check.h"
#include "
pcm_buffer.h
"
#include "
PcmBuffer.hxx
"
#include <stdint.h>
#include <stdint.h>
#include <stddef.h>
#include <stddef.h>
...
@@ -40,7 +40,7 @@ struct PcmResampler {
...
@@ -40,7 +40,7 @@ struct PcmResampler {
SRC_STATE
*
state
;
SRC_STATE
*
state
;
SRC_DATA
data
;
SRC_DATA
data
;
struct
pcm_b
uffer
in
,
out
;
PcmB
uffer
in
,
out
;
struct
{
struct
{
unsigned
src_rate
;
unsigned
src_rate
;
...
@@ -51,7 +51,7 @@ struct PcmResampler {
...
@@ -51,7 +51,7 @@ struct PcmResampler {
int
error
;
int
error
;
#endif
#endif
struct
pcm_b
uffer
buffer
;
PcmB
uffer
buffer
;
PcmResampler
();
PcmResampler
();
~
PcmResampler
();
~
PcmResampler
();
...
...
src/pcm/PcmResampleFallback.cxx
View file @
c75cb67c
...
@@ -22,18 +22,6 @@
...
@@ -22,18 +22,6 @@
#include <assert.h>
#include <assert.h>
void
pcm_resample_fallback_init
(
PcmResampler
*
state
)
{
pcm_buffer_init
(
&
state
->
buffer
);
}
void
pcm_resample_fallback_deinit
(
PcmResampler
*
state
)
{
pcm_buffer_deinit
(
&
state
->
buffer
);
}
/* resampling code blatantly ripped from ESD */
/* resampling code blatantly ripped from ESD */
const
int16_t
*
const
int16_t
*
pcm_resample_fallback_16
(
PcmResampler
*
state
,
pcm_resample_fallback_16
(
PcmResampler
*
state
,
...
@@ -49,8 +37,7 @@ pcm_resample_fallback_16(PcmResampler *state,
...
@@ -49,8 +37,7 @@ pcm_resample_fallback_16(PcmResampler *state,
(
src_frames
*
dest_rate
+
src_rate
-
1
)
/
src_rate
;
(
src_frames
*
dest_rate
+
src_rate
-
1
)
/
src_rate
;
unsigned
dest_samples
=
dest_frames
*
channels
;
unsigned
dest_samples
=
dest_frames
*
channels
;
size_t
dest_size
=
dest_samples
*
sizeof
(
*
src_buffer
);
size_t
dest_size
=
dest_samples
*
sizeof
(
*
src_buffer
);
int16_t
*
dest_buffer
=
(
int16_t
*
)
int16_t
*
dest_buffer
=
(
int16_t
*
)
state
->
buffer
.
Get
(
dest_size
);
pcm_buffer_get
(
&
state
->
buffer
,
dest_size
);
assert
((
src_size
%
(
sizeof
(
*
src_buffer
)
*
channels
))
==
0
);
assert
((
src_size
%
(
sizeof
(
*
src_buffer
)
*
channels
))
==
0
);
...
@@ -91,8 +78,7 @@ pcm_resample_fallback_32(PcmResampler *state,
...
@@ -91,8 +78,7 @@ pcm_resample_fallback_32(PcmResampler *state,
(
src_frames
*
dest_rate
+
src_rate
-
1
)
/
src_rate
;
(
src_frames
*
dest_rate
+
src_rate
-
1
)
/
src_rate
;
unsigned
dest_samples
=
dest_frames
*
channels
;
unsigned
dest_samples
=
dest_frames
*
channels
;
size_t
dest_size
=
dest_samples
*
sizeof
(
*
src_buffer
);
size_t
dest_size
=
dest_samples
*
sizeof
(
*
src_buffer
);
int32_t
*
dest_buffer
=
(
int32_t
*
)
int32_t
*
dest_buffer
=
(
int32_t
*
)
state
->
buffer
.
Get
(
dest_size
);
pcm_buffer_get
(
&
state
->
buffer
,
dest_size
);
assert
((
src_size
%
(
sizeof
(
*
src_buffer
)
*
channels
))
==
0
);
assert
((
src_size
%
(
sizeof
(
*
src_buffer
)
*
channels
))
==
0
);
...
...
src/pcm/PcmResampleInternal.hxx
View file @
c75cb67c
...
@@ -71,12 +71,6 @@ pcm_resample_lsr_32(PcmResampler *state,
...
@@ -71,12 +71,6 @@ pcm_resample_lsr_32(PcmResampler *state,
#endif
#endif
void
pcm_resample_fallback_init
(
PcmResampler
*
state
);
void
pcm_resample_fallback_deinit
(
PcmResampler
*
state
);
const
int16_t
*
const
int16_t
*
pcm_resample_fallback_16
(
PcmResampler
*
state
,
pcm_resample_fallback_16
(
PcmResampler
*
state
,
unsigned
channels
,
unsigned
channels
,
...
...
src/pcm/PcmResampleLibsamplerate.cxx
View file @
c75cb67c
...
@@ -86,11 +86,10 @@ pcm_resample_lsr_global_init(const char *converter, GError **error_r)
...
@@ -86,11 +86,10 @@ pcm_resample_lsr_global_init(const char *converter, GError **error_r)
void
void
pcm_resample_lsr_init
(
PcmResampler
*
state
)
pcm_resample_lsr_init
(
PcmResampler
*
state
)
{
{
memset
(
state
,
0
,
sizeof
(
*
state
));
state
->
state
=
nullptr
;
memset
(
&
state
->
data
,
0
,
sizeof
(
state
->
data
));
pcm_buffer_init
(
&
state
->
in
);
memset
(
&
state
->
prev
,
0
,
sizeof
(
state
->
prev
));
pcm_buffer_init
(
&
state
->
out
);
state
->
error
=
0
;
pcm_buffer_init
(
&
state
->
buffer
);
}
}
void
void
...
@@ -98,10 +97,6 @@ pcm_resample_lsr_deinit(PcmResampler *state)
...
@@ -98,10 +97,6 @@ pcm_resample_lsr_deinit(PcmResampler *state)
{
{
if
(
state
->
state
!=
nullptr
)
if
(
state
->
state
!=
nullptr
)
state
->
state
=
src_delete
(
state
->
state
);
state
->
state
=
src_delete
(
state
->
state
);
pcm_buffer_deinit
(
&
state
->
in
);
pcm_buffer_deinit
(
&
state
->
out
);
pcm_buffer_deinit
(
&
state
->
buffer
);
}
}
void
void
...
@@ -184,7 +179,7 @@ pcm_resample_lsr_float(PcmResampler *state,
...
@@ -184,7 +179,7 @@ pcm_resample_lsr_float(PcmResampler *state,
data
->
output_frames
=
(
src_size
*
dest_rate
+
src_rate
-
1
)
/
src_rate
;
data
->
output_frames
=
(
src_size
*
dest_rate
+
src_rate
-
1
)
/
src_rate
;
size_t
data_out_size
=
data
->
output_frames
*
sizeof
(
float
)
*
channels
;
size_t
data_out_size
=
data
->
output_frames
*
sizeof
(
float
)
*
channels
;
data
->
data_out
=
(
float
*
)
pcm_buffer_get
(
&
state
->
out
,
data_out_size
);
data
->
data_out
=
(
float
*
)
state
->
out
.
Get
(
data_out_size
);
if
(
!
lsr_process
(
state
,
error_r
))
if
(
!
lsr_process
(
state
,
error_r
))
return
nullptr
;
return
nullptr
;
...
@@ -212,11 +207,11 @@ pcm_resample_lsr_16(PcmResampler *state,
...
@@ -212,11 +207,11 @@ pcm_resample_lsr_16(PcmResampler *state,
data
->
input_frames
=
src_size
/
sizeof
(
*
src_buffer
)
/
channels
;
data
->
input_frames
=
src_size
/
sizeof
(
*
src_buffer
)
/
channels
;
size_t
data_in_size
=
data
->
input_frames
*
sizeof
(
float
)
*
channels
;
size_t
data_in_size
=
data
->
input_frames
*
sizeof
(
float
)
*
channels
;
data
->
data_in
=
(
float
*
)
pcm_buffer_get
(
&
state
->
in
,
data_in_size
);
data
->
data_in
=
(
float
*
)
state
->
in
.
Get
(
data_in_size
);
data
->
output_frames
=
(
src_size
*
dest_rate
+
src_rate
-
1
)
/
src_rate
;
data
->
output_frames
=
(
src_size
*
dest_rate
+
src_rate
-
1
)
/
src_rate
;
size_t
data_out_size
=
data
->
output_frames
*
sizeof
(
float
)
*
channels
;
size_t
data_out_size
=
data
->
output_frames
*
sizeof
(
float
)
*
channels
;
data
->
data_out
=
(
float
*
)
pcm_buffer_get
(
&
state
->
out
,
data_out_size
);
data
->
data_out
=
(
float
*
)
state
->
out
.
Get
(
data_out_size
);
src_short_to_float_array
(
src_buffer
,
data
->
data_in
,
src_short_to_float_array
(
src_buffer
,
data
->
data_in
,
data
->
input_frames
*
channels
);
data
->
input_frames
*
channels
);
...
@@ -227,7 +222,7 @@ pcm_resample_lsr_16(PcmResampler *state,
...
@@ -227,7 +222,7 @@ pcm_resample_lsr_16(PcmResampler *state,
int16_t
*
dest_buffer
;
int16_t
*
dest_buffer
;
*
dest_size_r
=
data
->
output_frames_gen
*
*
dest_size_r
=
data
->
output_frames_gen
*
sizeof
(
*
dest_buffer
)
*
channels
;
sizeof
(
*
dest_buffer
)
*
channels
;
dest_buffer
=
(
int16_t
*
)
pcm_buffer_get
(
&
state
->
buffer
,
*
dest_size_r
);
dest_buffer
=
(
int16_t
*
)
state
->
buffer
.
Get
(
*
dest_size_r
);
src_float_to_short_array
(
data
->
data_out
,
dest_buffer
,
src_float_to_short_array
(
data
->
data_out
,
dest_buffer
,
data
->
output_frames_gen
*
channels
);
data
->
output_frames_gen
*
channels
);
...
@@ -272,11 +267,11 @@ pcm_resample_lsr_32(PcmResampler *state,
...
@@ -272,11 +267,11 @@ pcm_resample_lsr_32(PcmResampler *state,
data
->
input_frames
=
src_size
/
sizeof
(
*
src_buffer
)
/
channels
;
data
->
input_frames
=
src_size
/
sizeof
(
*
src_buffer
)
/
channels
;
size_t
data_in_size
=
data
->
input_frames
*
sizeof
(
float
)
*
channels
;
size_t
data_in_size
=
data
->
input_frames
*
sizeof
(
float
)
*
channels
;
data
->
data_in
=
(
float
*
)
pcm_buffer_get
(
&
state
->
in
,
data_in_size
);
data
->
data_in
=
(
float
*
)
state
->
in
.
Get
(
data_in_size
);
data
->
output_frames
=
(
src_size
*
dest_rate
+
src_rate
-
1
)
/
src_rate
;
data
->
output_frames
=
(
src_size
*
dest_rate
+
src_rate
-
1
)
/
src_rate
;
size_t
data_out_size
=
data
->
output_frames
*
sizeof
(
float
)
*
channels
;
size_t
data_out_size
=
data
->
output_frames
*
sizeof
(
float
)
*
channels
;
data
->
data_out
=
(
float
*
)
pcm_buffer_get
(
&
state
->
out
,
data_out_size
);
data
->
data_out
=
(
float
*
)
state
->
out
.
Get
(
data_out_size
);
src_int_to_float_array
(
src_buffer
,
data
->
data_in
,
src_int_to_float_array
(
src_buffer
,
data
->
data_in
,
data
->
input_frames
*
channels
);
data
->
input_frames
*
channels
);
...
@@ -287,7 +282,7 @@ pcm_resample_lsr_32(PcmResampler *state,
...
@@ -287,7 +282,7 @@ pcm_resample_lsr_32(PcmResampler *state,
int32_t
*
dest_buffer
;
int32_t
*
dest_buffer
;
*
dest_size_r
=
data
->
output_frames_gen
*
*
dest_size_r
=
data
->
output_frames_gen
*
sizeof
(
*
dest_buffer
)
*
channels
;
sizeof
(
*
dest_buffer
)
*
channels
;
dest_buffer
=
(
int32_t
*
)
pcm_buffer_get
(
&
state
->
buffer
,
*
dest_size_r
);
dest_buffer
=
(
int32_t
*
)
state
->
buffer
.
Get
(
*
dest_size_r
);
src_float_to_int_array
(
data
->
data_out
,
dest_buffer
,
src_float_to_int_array
(
data
->
data_out
,
dest_buffer
,
data
->
output_frames_gen
*
channels
);
data
->
output_frames_gen
*
channels
);
...
...
test/test_pcm_channels.cxx
View file @
c75cb67c
...
@@ -21,7 +21,7 @@
...
@@ -21,7 +21,7 @@
#include "test_pcm_all.hxx"
#include "test_pcm_all.hxx"
#include "test_pcm_util.hxx"
#include "test_pcm_util.hxx"
#include "pcm/PcmChannels.hxx"
#include "pcm/PcmChannels.hxx"
#include "pcm/
pcm_buffer.h
"
#include "pcm/
PcmBuffer.hxx
"
#include <glib.h>
#include <glib.h>
...
@@ -31,14 +31,13 @@ test_pcm_channels_16()
...
@@ -31,14 +31,13 @@ test_pcm_channels_16()
constexpr
unsigned
N
=
256
;
constexpr
unsigned
N
=
256
;
const
auto
src
=
TestDataBuffer
<
int16_t
,
N
*
2
>
();
const
auto
src
=
TestDataBuffer
<
int16_t
,
N
*
2
>
();
struct
pcm_buffer
buffer
;
PcmBuffer
buffer
;
pcm_buffer_init
(
&
buffer
);
/* stereo to mono */
/* stereo to mono */
size_t
dest_size
;
size_t
dest_size
;
const
int16_t
*
dest
=
const
int16_t
*
dest
=
pcm_convert_channels_16
(
&
buffer
,
1
,
2
,
src
,
sizeof
(
src
),
pcm_convert_channels_16
(
buffer
,
1
,
2
,
src
,
sizeof
(
src
),
&
dest_size
);
&
dest_size
);
g_assert
(
dest
!=
NULL
);
g_assert
(
dest
!=
NULL
);
g_assert_cmpint
(
dest_size
,
==
,
sizeof
(
src
)
/
2
);
g_assert_cmpint
(
dest_size
,
==
,
sizeof
(
src
)
/
2
);
...
@@ -48,7 +47,7 @@ test_pcm_channels_16()
...
@@ -48,7 +47,7 @@ test_pcm_channels_16()
/* mono to stereo */
/* mono to stereo */
dest
=
pcm_convert_channels_16
(
&
buffer
,
2
,
1
,
src
,
sizeof
(
src
),
dest
=
pcm_convert_channels_16
(
buffer
,
2
,
1
,
src
,
sizeof
(
src
),
&
dest_size
);
&
dest_size
);
g_assert
(
dest
!=
NULL
);
g_assert
(
dest
!=
NULL
);
g_assert_cmpint
(
dest_size
,
==
,
sizeof
(
src
)
*
2
);
g_assert_cmpint
(
dest_size
,
==
,
sizeof
(
src
)
*
2
);
...
@@ -56,8 +55,6 @@ test_pcm_channels_16()
...
@@ -56,8 +55,6 @@ test_pcm_channels_16()
g_assert_cmpint
(
dest
[
i
*
2
],
==
,
src
[
i
]);
g_assert_cmpint
(
dest
[
i
*
2
],
==
,
src
[
i
]);
g_assert_cmpint
(
dest
[
i
*
2
+
1
],
==
,
src
[
i
]);
g_assert_cmpint
(
dest
[
i
*
2
+
1
],
==
,
src
[
i
]);
}
}
pcm_buffer_deinit
(
&
buffer
);
}
}
void
void
...
@@ -66,14 +63,13 @@ test_pcm_channels_32()
...
@@ -66,14 +63,13 @@ test_pcm_channels_32()
constexpr
unsigned
N
=
256
;
constexpr
unsigned
N
=
256
;
const
auto
src
=
TestDataBuffer
<
int32_t
,
N
*
2
>
();
const
auto
src
=
TestDataBuffer
<
int32_t
,
N
*
2
>
();
struct
pcm_buffer
buffer
;
PcmBuffer
buffer
;
pcm_buffer_init
(
&
buffer
);
/* stereo to mono */
/* stereo to mono */
size_t
dest_size
;
size_t
dest_size
;
const
int32_t
*
dest
=
const
int32_t
*
dest
=
pcm_convert_channels_32
(
&
buffer
,
1
,
2
,
src
,
sizeof
(
src
),
pcm_convert_channels_32
(
buffer
,
1
,
2
,
src
,
sizeof
(
src
),
&
dest_size
);
&
dest_size
);
g_assert
(
dest
!=
NULL
);
g_assert
(
dest
!=
NULL
);
g_assert_cmpint
(
dest_size
,
==
,
sizeof
(
src
)
/
2
);
g_assert_cmpint
(
dest_size
,
==
,
sizeof
(
src
)
/
2
);
...
@@ -83,7 +79,7 @@ test_pcm_channels_32()
...
@@ -83,7 +79,7 @@ test_pcm_channels_32()
/* mono to stereo */
/* mono to stereo */
dest
=
pcm_convert_channels_32
(
&
buffer
,
2
,
1
,
src
,
sizeof
(
src
),
dest
=
pcm_convert_channels_32
(
buffer
,
2
,
1
,
src
,
sizeof
(
src
),
&
dest_size
);
&
dest_size
);
g_assert
(
dest
!=
NULL
);
g_assert
(
dest
!=
NULL
);
g_assert_cmpint
(
dest_size
,
==
,
sizeof
(
src
)
*
2
);
g_assert_cmpint
(
dest_size
,
==
,
sizeof
(
src
)
*
2
);
...
@@ -91,6 +87,4 @@ test_pcm_channels_32()
...
@@ -91,6 +87,4 @@ test_pcm_channels_32()
g_assert_cmpint
(
dest
[
i
*
2
],
==
,
src
[
i
]);
g_assert_cmpint
(
dest
[
i
*
2
],
==
,
src
[
i
]);
g_assert_cmpint
(
dest
[
i
*
2
+
1
],
==
,
src
[
i
]);
g_assert_cmpint
(
dest
[
i
*
2
+
1
],
==
,
src
[
i
]);
}
}
pcm_buffer_deinit
(
&
buffer
);
}
}
test/test_pcm_format.cxx
View file @
c75cb67c
...
@@ -23,7 +23,7 @@
...
@@ -23,7 +23,7 @@
#include "pcm/PcmFormat.hxx"
#include "pcm/PcmFormat.hxx"
#include "pcm/PcmDither.hxx"
#include "pcm/PcmDither.hxx"
#include "pcm/PcmUtils.hxx"
#include "pcm/PcmUtils.hxx"
#include "pcm/
pcm_buffer.h
"
#include "pcm/
PcmBuffer.hxx
"
#include "audio_format.h"
#include "audio_format.h"
#include <glib.h>
#include <glib.h>
...
@@ -34,20 +34,17 @@ test_pcm_format_8_to_16()
...
@@ -34,20 +34,17 @@ test_pcm_format_8_to_16()
constexpr
unsigned
N
=
256
;
constexpr
unsigned
N
=
256
;
const
auto
src
=
TestDataBuffer
<
int8_t
,
N
>
();
const
auto
src
=
TestDataBuffer
<
int8_t
,
N
>
();
struct
pcm_buffer
buffer
;
PcmBuffer
buffer
;
pcm_buffer_init
(
&
buffer
);
size_t
d_size
;
size_t
d_size
;
PcmDither
dither
;
PcmDither
dither
;
auto
d
=
pcm_convert_to_16
(
&
buffer
,
dither
,
SAMPLE_FORMAT_S8
,
auto
d
=
pcm_convert_to_16
(
buffer
,
dither
,
SAMPLE_FORMAT_S8
,
src
,
sizeof
(
src
),
&
d_size
);
src
,
sizeof
(
src
),
&
d_size
);
auto
d_end
=
pcm_end_pointer
(
d
,
d_size
);
auto
d_end
=
pcm_end_pointer
(
d
,
d_size
);
g_assert_cmpint
(
d_end
-
d
,
==
,
N
);
g_assert_cmpint
(
d_end
-
d
,
==
,
N
);
for
(
size_t
i
=
0
;
i
<
N
;
++
i
)
for
(
size_t
i
=
0
;
i
<
N
;
++
i
)
g_assert_cmpint
(
src
[
i
],
==
,
d
[
i
]
>>
8
);
g_assert_cmpint
(
src
[
i
],
==
,
d
[
i
]
>>
8
);
pcm_buffer_deinit
(
&
buffer
);
}
}
void
void
...
@@ -56,19 +53,16 @@ test_pcm_format_16_to_24()
...
@@ -56,19 +53,16 @@ test_pcm_format_16_to_24()
constexpr
unsigned
N
=
256
;
constexpr
unsigned
N
=
256
;
const
auto
src
=
TestDataBuffer
<
int16_t
,
N
>
();
const
auto
src
=
TestDataBuffer
<
int16_t
,
N
>
();
struct
pcm_buffer
buffer
;
PcmBuffer
buffer
;
pcm_buffer_init
(
&
buffer
);
size_t
d_size
;
size_t
d_size
;
auto
d
=
pcm_convert_to_24
(
&
buffer
,
SAMPLE_FORMAT_S16
,
auto
d
=
pcm_convert_to_24
(
buffer
,
SAMPLE_FORMAT_S16
,
src
,
sizeof
(
src
),
&
d_size
);
src
,
sizeof
(
src
),
&
d_size
);
auto
d_end
=
pcm_end_pointer
(
d
,
d_size
);
auto
d_end
=
pcm_end_pointer
(
d
,
d_size
);
g_assert_cmpint
(
d_end
-
d
,
==
,
N
);
g_assert_cmpint
(
d_end
-
d
,
==
,
N
);
for
(
size_t
i
=
0
;
i
<
N
;
++
i
)
for
(
size_t
i
=
0
;
i
<
N
;
++
i
)
g_assert_cmpint
(
src
[
i
],
==
,
d
[
i
]
>>
8
);
g_assert_cmpint
(
src
[
i
],
==
,
d
[
i
]
>>
8
);
pcm_buffer_deinit
(
&
buffer
);
}
}
void
void
...
@@ -77,19 +71,16 @@ test_pcm_format_16_to_32()
...
@@ -77,19 +71,16 @@ test_pcm_format_16_to_32()
constexpr
unsigned
N
=
256
;
constexpr
unsigned
N
=
256
;
const
auto
src
=
TestDataBuffer
<
int16_t
,
N
>
();
const
auto
src
=
TestDataBuffer
<
int16_t
,
N
>
();
struct
pcm_buffer
buffer
;
PcmBuffer
buffer
;
pcm_buffer_init
(
&
buffer
);
size_t
d_size
;
size_t
d_size
;
auto
d
=
pcm_convert_to_32
(
&
buffer
,
SAMPLE_FORMAT_S16
,
auto
d
=
pcm_convert_to_32
(
buffer
,
SAMPLE_FORMAT_S16
,
src
,
sizeof
(
src
),
&
d_size
);
src
,
sizeof
(
src
),
&
d_size
);
auto
d_end
=
pcm_end_pointer
(
d
,
d_size
);
auto
d_end
=
pcm_end_pointer
(
d
,
d_size
);
g_assert_cmpint
(
d_end
-
d
,
==
,
N
);
g_assert_cmpint
(
d_end
-
d
,
==
,
N
);
for
(
size_t
i
=
0
;
i
<
N
;
++
i
)
for
(
size_t
i
=
0
;
i
<
N
;
++
i
)
g_assert_cmpint
(
src
[
i
],
==
,
d
[
i
]
>>
16
);
g_assert_cmpint
(
src
[
i
],
==
,
d
[
i
]
>>
16
);
pcm_buffer_deinit
(
&
buffer
);
}
}
void
void
...
@@ -98,12 +89,10 @@ test_pcm_format_float()
...
@@ -98,12 +89,10 @@ test_pcm_format_float()
constexpr
unsigned
N
=
256
;
constexpr
unsigned
N
=
256
;
const
auto
src
=
TestDataBuffer
<
int16_t
,
N
>
();
const
auto
src
=
TestDataBuffer
<
int16_t
,
N
>
();
struct
pcm_buffer
buffer1
,
buffer2
;
PcmBuffer
buffer1
,
buffer2
;
pcm_buffer_init
(
&
buffer1
);
pcm_buffer_init
(
&
buffer2
);
size_t
f_size
;
size_t
f_size
;
auto
f
=
pcm_convert_to_float
(
&
buffer1
,
SAMPLE_FORMAT_S16
,
auto
f
=
pcm_convert_to_float
(
buffer1
,
SAMPLE_FORMAT_S16
,
src
,
sizeof
(
src
),
&
f_size
);
src
,
sizeof
(
src
),
&
f_size
);
auto
f_end
=
pcm_end_pointer
(
f
,
f_size
);
auto
f_end
=
pcm_end_pointer
(
f
,
f_size
);
g_assert_cmpint
(
f_end
-
f
,
==
,
N
);
g_assert_cmpint
(
f_end
-
f
,
==
,
N
);
...
@@ -116,7 +105,7 @@ test_pcm_format_float()
...
@@ -116,7 +105,7 @@ test_pcm_format_float()
PcmDither
dither
;
PcmDither
dither
;
size_t
d_size
;
size_t
d_size
;
auto
d
=
pcm_convert_to_16
(
&
buffer2
,
dither
,
auto
d
=
pcm_convert_to_16
(
buffer2
,
dither
,
SAMPLE_FORMAT_FLOAT
,
SAMPLE_FORMAT_FLOAT
,
f
,
f_size
,
&
d_size
);
f
,
f_size
,
&
d_size
);
auto
d_end
=
pcm_end_pointer
(
d
,
d_size
);
auto
d_end
=
pcm_end_pointer
(
d
,
d_size
);
...
@@ -124,7 +113,4 @@ test_pcm_format_float()
...
@@ -124,7 +113,4 @@ test_pcm_format_float()
for
(
size_t
i
=
0
;
i
<
N
;
++
i
)
for
(
size_t
i
=
0
;
i
<
N
;
++
i
)
g_assert_cmpint
(
src
[
i
],
==
,
d
[
i
]);
g_assert_cmpint
(
src
[
i
],
==
,
d
[
i
]);
pcm_buffer_deinit
(
&
buffer1
);
pcm_buffer_deinit
(
&
buffer2
);
}
}
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