Skip to content
GitLab
Menu
Projects
Groups
Snippets
/
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Menu
Open sidebar
Xiph.Org
flac
Commits
994b5179
Commit
994b5179
authored
Feb 28, 2001
by
Josh Coalson
Browse files
fix 24-bit support
parent
d2b9453e
Changes
1
Hide whitespace changes
Inline
Side-by-side
src/flac/decode.c
View file @
994b5179
...
...
@@ -306,12 +306,12 @@ FLAC__StreamDecoderWriteStatus write_callback(const FLAC__FileDecoder *decoder,
bool
is_big_endian
=
(
stream_info
->
is_wave_out
?
false
:
stream_info
->
is_big_endian
);
bool
is_unsigned_samples
=
(
stream_info
->
is_wave_out
?
bps
<=
8
:
stream_info
->
is_unsigned_samples
);
unsigned
wide_samples
=
frame
->
header
.
blocksize
,
wide_sample
,
sample
,
channel
,
byte
;
static
signed
char
s
c
buffer
[
FLAC__MAX_BLOCK_SIZE
*
FLAC__MAX_CHANNELS
*
((
FLAC__MAX_BITS_PER_SAMPLE
+
7
)
>>
3
)];
/* WATCHOUT: can be up to 2 megs */
u
nsigned
char
*
u
c
buffer
=
(
u
nsigned
char
*
)
s
c
buffer
;
signed
short
*
s
s
buffer
=
(
signed
short
*
)
s
c
buffer
;
u
nsigned
short
*
u
s
buffer
=
(
u
nsigned
short
*
)
s
c
buffer
;
signed
*
s
l
buffer
=
(
signed
*
)
s
c
buffer
;
u
nsigned
*
u
l
buffer
=
(
u
nsigned
*
)
s
c
buffer
;
static
int8
s
8
buffer
[
FLAC__MAX_BLOCK_SIZE
*
FLAC__MAX_CHANNELS
*
((
FLAC__MAX_BITS_PER_SAMPLE
+
7
)
>>
3
)];
/* WATCHOUT: can be up to 2 megs */
u
int8
*
u
8
buffer
=
(
u
int8
*
)
s
8
buffer
;
int16
*
s
16
buffer
=
(
int16
*
)
s
8
buffer
;
u
int16
*
u
16
buffer
=
(
u
int16
*
)
s
8
buffer
;
int32
*
s
32
buffer
=
(
int32
*
)
s
8
buffer
;
u
int32
*
u
32
buffer
=
(
u
int32
*
)
s
8
buffer
;
(
void
)
decoder
;
...
...
@@ -355,83 +355,60 @@ FLAC__StreamDecoderWriteStatus write_callback(const FLAC__FileDecoder *decoder,
if
(
is_unsigned_samples
)
{
for
(
sample
=
wide_sample
=
0
;
wide_sample
<
wide_samples
;
wide_sample
++
)
for
(
channel
=
0
;
channel
<
channels
;
channel
++
,
sample
++
)
u
c
buffer
[
sample
]
=
buffer
[
channel
][
wide_sample
]
+
0x80
;
u
8
buffer
[
sample
]
=
buffer
[
channel
][
wide_sample
]
+
0x80
;
}
else
{
for
(
sample
=
wide_sample
=
0
;
wide_sample
<
wide_samples
;
wide_sample
++
)
for
(
channel
=
0
;
channel
<
channels
;
channel
++
,
sample
++
)
s
c
buffer
[
sample
]
=
buffer
[
channel
][
wide_sample
];
s
8
buffer
[
sample
]
=
buffer
[
channel
][
wide_sample
];
}
if
(
fwrite
(
u
c
buffer
,
1
,
sample
,
fout
)
!=
sample
)
if
(
fwrite
(
u
8
buffer
,
1
,
sample
,
fout
)
!=
sample
)
return
FLAC__STREAM_DECODER_WRITE_ABORT
;
}
else
if
(
bps
==
16
)
{
if
(
is_unsigned_samples
)
{
for
(
sample
=
wide_sample
=
0
;
wide_sample
<
wide_samples
;
wide_sample
++
)
for
(
channel
=
0
;
channel
<
channels
;
channel
++
,
sample
++
)
u
s
buffer
[
sample
]
=
buffer
[
channel
][
wide_sample
]
+
0x8000
;
u
16
buffer
[
sample
]
=
buffer
[
channel
][
wide_sample
]
+
0x8000
;
}
else
{
for
(
sample
=
wide_sample
=
0
;
wide_sample
<
wide_samples
;
wide_sample
++
)
for
(
channel
=
0
;
channel
<
channels
;
channel
++
,
sample
++
)
s
s
buffer
[
sample
]
=
buffer
[
channel
][
wide_sample
];
s
16
buffer
[
sample
]
=
buffer
[
channel
][
wide_sample
];
}
if
(
is_big_endian
!=
is_big_endian_host
)
{
unsigned
char
tmp
;
const
unsigned
bytes
=
sample
*
2
;
for
(
byte
=
0
;
byte
<
bytes
;
byte
+=
2
)
{
tmp
=
u
c
buffer
[
byte
];
u
c
buffer
[
byte
]
=
u
c
buffer
[
byte
+
1
];
u
c
buffer
[
byte
+
1
]
=
tmp
;
tmp
=
u
8
buffer
[
byte
];
u
8
buffer
[
byte
]
=
u
8
buffer
[
byte
+
1
];
u
8
buffer
[
byte
+
1
]
=
tmp
;
}
}
if
(
fwrite
(
u
s
buffer
,
2
,
sample
,
fout
)
!=
sample
)
if
(
fwrite
(
u
16
buffer
,
2
,
sample
,
fout
)
!=
sample
)
return
FLAC__STREAM_DECODER_WRITE_ABORT
;
}
else
if
(
bps
==
24
)
{
if
(
is_unsigned_samples
)
{
for
(
sample
=
wide_sample
=
0
;
wide_sample
<
wide_samples
;
wide_sample
++
)
for
(
channel
=
0
;
channel
<
channels
;
channel
++
,
sample
++
)
u
l
buffer
[
sample
]
=
buffer
[
channel
][
wide_sample
]
+
0x800000
;
u
32
buffer
[
sample
]
=
buffer
[
channel
][
wide_sample
]
+
0x800000
;
}
else
{
for
(
sample
=
wide_sample
=
0
;
wide_sample
<
wide_samples
;
wide_sample
++
)
for
(
channel
=
0
;
channel
<
channels
;
channel
++
,
sample
++
)
s
l
buffer
[
sample
]
=
buffer
[
channel
][
wide_sample
];
s
32
buffer
[
sample
]
=
buffer
[
channel
][
wide_sample
];
}
/*@@@
if(is_big_endian != is_big_endian_host) {
unsigned char tmp;
unsigned lbyte;
const unsigned bytes = sample * 4;
for(lbyte = byte = 0; byte < bytes; byte += 4, lbyte += 3) {
tmp = ucbuffer[byte];
ucbuffer[lbyte] = ucbuffer[byte+2];
ucbuffer[lbyte+2] = tmp;
ucbuffer[lbyte+1] = ucbuffer[byte+1];
}
}
else {
unsigned lbyte;
const unsigned bytes = sample * 4;
for(lbyte = byte = 0; byte < bytes; ) {
ucbuffer[lbyte++] = ucbuffer[byte++];
ucbuffer[lbyte++] = ucbuffer[byte++];
ucbuffer[lbyte++] = ucbuffer[byte++];
byte++;
}
}
*/
if
(
is_big_endian
!=
is_big_endian_host
)
{
unsigned
char
tmp
;
const
unsigned
bytes
=
sample
*
4
;
for
(
byte
=
0
;
byte
<
bytes
;
byte
+=
4
)
{
tmp
=
u
c
buffer
[
byte
];
u
c
buffer
[
byte
]
=
u
c
buffer
[
byte
+
3
];
u
c
buffer
[
byte
+
3
]
=
tmp
;
tmp
=
u
c
buffer
[
byte
+
1
];
u
c
buffer
[
byte
+
1
]
=
u
c
buffer
[
byte
+
2
];
u
c
buffer
[
byte
+
2
]
=
tmp
;
tmp
=
u
8
buffer
[
byte
];
u
8
buffer
[
byte
]
=
u
8
buffer
[
byte
+
3
];
u
8
buffer
[
byte
+
3
]
=
tmp
;
tmp
=
u
8
buffer
[
byte
+
1
];
u
8
buffer
[
byte
+
1
]
=
u
8
buffer
[
byte
+
2
];
u
8
buffer
[
byte
+
2
]
=
tmp
;
}
}
if
(
is_big_endian
)
{
...
...
@@ -439,22 +416,22 @@ FLAC__StreamDecoderWriteStatus write_callback(const FLAC__FileDecoder *decoder,
const
unsigned
bytes
=
sample
*
4
;
for
(
lbyte
=
byte
=
0
;
byte
<
bytes
;
)
{
byte
++
;
u
c
buffer
[
lbyte
++
]
=
u
c
buffer
[
byte
++
];
u
c
buffer
[
lbyte
++
]
=
u
c
buffer
[
byte
++
];
u
c
buffer
[
lbyte
++
]
=
u
c
buffer
[
byte
++
];
u
8
buffer
[
lbyte
++
]
=
u
8
buffer
[
byte
++
];
u
8
buffer
[
lbyte
++
]
=
u
8
buffer
[
byte
++
];
u
8
buffer
[
lbyte
++
]
=
u
8
buffer
[
byte
++
];
}
}
else
{
unsigned
lbyte
;
const
unsigned
bytes
=
sample
*
4
;
for
(
lbyte
=
byte
=
0
;
byte
<
bytes
;
)
{
u
c
buffer
[
lbyte
++
]
=
u
c
buffer
[
byte
++
];
u
c
buffer
[
lbyte
++
]
=
u
c
buffer
[
byte
++
];
u
c
buffer
[
lbyte
++
]
=
u
c
buffer
[
byte
++
];
u
8
buffer
[
lbyte
++
]
=
u
8
buffer
[
byte
++
];
u
8
buffer
[
lbyte
++
]
=
u
8
buffer
[
byte
++
];
u
8
buffer
[
lbyte
++
]
=
u
8
buffer
[
byte
++
];
byte
++
;
}
}
if
(
fwrite
(
u
c
buffer
,
3
,
sample
,
fout
)
!=
sample
)
if
(
fwrite
(
u
8
buffer
,
3
,
sample
,
fout
)
!=
sample
)
return
FLAC__STREAM_DECODER_WRITE_ABORT
;
}
else
{
...
...
Write
Preview
Supports
Markdown
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