FS patch #5172 by Andrew Cupper. Musepack seeking support. Decoder should also be faster.
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@10827 a1c6a512-1295-4272-9138-f99709370657
This commit is contained in:
parent
6af8603d9a
commit
20332bce1d
9 changed files with 842 additions and 258 deletions
|
@ -40,6 +40,8 @@ typedef unsigned char mpc_bool_t;
|
|||
#define FALSE 0
|
||||
|
||||
/* these are filled in by configure */
|
||||
typedef signed char mpc_int8_t;
|
||||
typedef unsigned char mpc_uint8_t;
|
||||
typedef short mpc_int16_t;
|
||||
typedef unsigned short mpc_uint16_t;
|
||||
typedef int mpc_int32_t;
|
||||
|
|
|
@ -44,6 +44,7 @@
|
|||
#include "streaminfo.h"
|
||||
|
||||
#define MPC_SUPPORT_SV456
|
||||
#define SCF_HACK
|
||||
|
||||
enum {
|
||||
MPC_V_MEM = 2304,
|
||||
|
@ -51,8 +52,8 @@ enum {
|
|||
};
|
||||
|
||||
typedef struct {
|
||||
mpc_int32_t L [36];
|
||||
mpc_int32_t R [36];
|
||||
mpc_int16_t L [36];
|
||||
mpc_int16_t R [36];
|
||||
} QuantTyp;
|
||||
|
||||
typedef struct mpc_decoder_t {
|
||||
|
@ -61,10 +62,12 @@ typedef struct mpc_decoder_t {
|
|||
/// @name internal state variables
|
||||
//@{
|
||||
|
||||
mpc_uint32_t next;
|
||||
mpc_uint32_t dword; /// currently decoded 32bit-word
|
||||
mpc_uint32_t pos; /// bit-position within dword
|
||||
mpc_uint32_t Speicher[MPC_DECODER_MEMSIZE]; /// read-buffer
|
||||
mpc_uint32_t *Speicher; /// read-buffer
|
||||
mpc_uint32_t Zaehler; /// actual index within read-buffer
|
||||
mpc_uint32_t Ring;
|
||||
|
||||
mpc_uint32_t samples_to_skip;
|
||||
mpc_uint32_t last_block_samples;
|
||||
|
@ -74,6 +77,9 @@ typedef struct mpc_decoder_t {
|
|||
|
||||
mpc_uint32_t DecodedFrames;
|
||||
mpc_uint32_t OverallFrames;
|
||||
mpc_uint32_t MaxDecodedFrames; // Maximum frames decoded (indicates usable seek table entries)
|
||||
mpc_uint16_t SeekTableIndex;
|
||||
mpc_uint32_t SeekTableCounter;
|
||||
mpc_int32_t SampleRate; // Sample frequency
|
||||
|
||||
mpc_uint32_t StreamVersion; // version of bitstream
|
||||
|
@ -90,28 +96,34 @@ typedef struct mpc_decoder_t {
|
|||
mpc_uint32_t __r1;
|
||||
mpc_uint32_t __r2;
|
||||
|
||||
mpc_int32_t SCF_Index_L [32] [3];
|
||||
mpc_int32_t SCF_Index_R [32] [3]; // holds scalefactor-indices
|
||||
mpc_int8_t SCF_Index_L [32] [3];
|
||||
mpc_int8_t SCF_Index_R [32] [3]; // holds scalefactor-indices
|
||||
QuantTyp Q [32]; // holds quantized samples
|
||||
mpc_int32_t Res_L [32];
|
||||
mpc_int32_t Res_R [32]; // holds the chosen quantizer for each subband
|
||||
mpc_int8_t Res_L [32];
|
||||
mpc_int8_t Res_R [32]; // holds the chosen quantizer for each subband
|
||||
#ifdef MPC_SUPPORT_SV456
|
||||
mpc_bool_t DSCF_Flag_L [32];
|
||||
mpc_bool_t DSCF_Flag_R [32]; // differential SCF used?
|
||||
mpc_int32_t SCFI_L [32];
|
||||
mpc_int32_t SCFI_R [32]; // describes order of transmitted SCF
|
||||
mpc_int32_t DSCF_Reference_L [32];
|
||||
mpc_int32_t DSCF_Reference_R [32]; // holds last frames SCF
|
||||
#endif
|
||||
mpc_int8_t SCFI_L [32];
|
||||
mpc_int8_t SCFI_R [32]; // describes order of transmitted SCF
|
||||
//mpc_int32_t DSCF_Reference_L [32];
|
||||
//mpc_int32_t DSCF_Reference_R [32]; // holds last frames SCF
|
||||
mpc_bool_t MS_Flag[32]; // MS used?
|
||||
|
||||
mpc_uint32_t* SeekTable;
|
||||
mpc_bool_t Use_SeekTable;
|
||||
mpc_bool_t Use_FastSeek;
|
||||
mpc_bool_t Use_StaticSeekTable;
|
||||
mpc_uint8_t SeekTable_Step;
|
||||
mpc_uint32_t Max_SeekTable_Size;
|
||||
|
||||
#ifdef MPC_FIXED_POINT
|
||||
unsigned char SCF_shift[256];
|
||||
#endif
|
||||
|
||||
/* These two see very frequent use in synth_filter.c, so we'll put them
|
||||
in IRAM for Rockbox use. Actual arrays are placed in mpc_decoder.c */
|
||||
/* MPC_SAMPLE_FORMAT V_L[MPC_V_MEM + 960]; */
|
||||
/* MPC_SAMPLE_FORMAT V_R[MPC_V_MEM + 960]; */
|
||||
MPC_SAMPLE_FORMAT *V_L;
|
||||
MPC_SAMPLE_FORMAT *V_R;
|
||||
MPC_SAMPLE_FORMAT V_L[MPC_V_MEM + 960];
|
||||
MPC_SAMPLE_FORMAT V_R[MPC_V_MEM + 960];
|
||||
MPC_SAMPLE_FORMAT Y_L[36][32];
|
||||
MPC_SAMPLE_FORMAT Y_R[36][32];
|
||||
MPC_SAMPLE_FORMAT SCF[256]; ///< holds adapted scalefactors (for clipping prevention)
|
||||
|
|
|
@ -46,8 +46,8 @@ struct mpc_decoder_t; // forward declare to break circular dependencies
|
|||
/// Huffman table entry.
|
||||
typedef struct huffman_type_t {
|
||||
mpc_uint32_t Code;
|
||||
mpc_uint16_t Length;
|
||||
mpc_int16_t Value;
|
||||
mpc_uint8_t Length;
|
||||
mpc_int8_t Value;
|
||||
} HuffmanTyp;
|
||||
|
||||
#endif // _mpcdec_huffman_h_
|
||||
|
|
|
@ -39,38 +39,38 @@
|
|||
#include <huffman.h>
|
||||
#include <requant.h>
|
||||
|
||||
const HuffmanTyp mpc_table_HuffHdr [10] =
|
||||
const HuffmanTyp mpc_table_HuffHdr [10] ICONST_ATTR =
|
||||
{{2147483648u,1,0},{1610612736u,3,1},{1577058304u,7,-4},{1568669696u,9,3},{1560281088u,9,4},{1543503872u,8,-5},{1476395008u,6,2},{1342177280u,5,-3},{1073741824u,4,-2},{0u,2,-1},};
|
||||
const HuffmanTyp mpc_table_HuffSCFI [ 4] =
|
||||
const HuffmanTyp mpc_table_HuffSCFI [ 4] ICONST_ATTR =
|
||||
{{2147483648u,1,1},{1610612736u,3,2},{1073741824u,3,0},{0u,2,3},};
|
||||
const HuffmanTyp mpc_table_HuffDSCF [16] =
|
||||
const HuffmanTyp mpc_table_HuffDSCF [16] ICONST_ATTR =
|
||||
{{4160749568u,5,5},{4026531840u,5,-4},{3758096384u,4,3},{3489660928u,4,-3},{3221225472u,4,8},{2684354560u,3,1},{2415919104u,4,0},{2281701376u,5,-5},{2214592512u,6,7},{2147483648u,6,-7},{1610612736u,3,-1},{1073741824u,3,2},{805306368u,4,4},{671088640u,5,6},{536870912u,5,-6},{0u,3,-2},};
|
||||
|
||||
static const HuffmanTyp mpc_table_HuffQ1 [2] [3*3*3] = {
|
||||
static const HuffmanTyp mpc_table_HuffQ1 [2] [3*3*3] ICONST_ATTR = {
|
||||
{{3758096384u,3,13},{3690987520u,6,26},{3623878656u,6,0},{3556769792u,6,20},{3489660928u,6,6},{3221225472u,4,14},{2952790016u,4,12},{2684354560u,4,4},{2415919104u,4,22},{2348810240u,6,8},{2281701376u,6,18},{2214592512u,6,24},{2147483648u,6,2},{1879048192u,4,16},{1610612736u,4,10},{1476395008u,5,17},{1342177280u,5,9},{1207959552u,5,1},{1073741824u,5,25},{939524096u,5,5},{805306368u,5,21},{671088640u,5,3},{536870912u,5,11},{402653184u,5,15},{268435456u,5,23},{134217728u,5,19},{0u,5,7},},
|
||||
{{2147483648u,1,13},{2113929216u,7,15},{2080374784u,7,1},{2046820352u,7,11},{2013265920u,7,7},{1979711488u,7,17},{1946157056u,7,25},{1912602624u,7,19},{1904214016u,9,8},{1895825408u,9,18},{1887436800u,9,2},{1879048192u,9,24},{1845493760u,7,3},{1811939328u,7,23},{1778384896u,7,21},{1744830464u,7,5},{1728053248u,8,0},{1711276032u,8,26},{1694498816u,8,6},{1677721600u,8,20},{1610612736u,6,9},{1342177280u,4,14},{1073741824u,4,12},{805306368u,4,4},{536870912u,4,22},{268435456u,4,16},{0u,4,10},},
|
||||
};
|
||||
static const HuffmanTyp mpc_table_HuffQ2 [2] [5*5] = {
|
||||
static const HuffmanTyp mpc_table_HuffQ2 [2] [5*5] ICONST_ATTR = {
|
||||
{{4026531840u,4,13},{3758096384u,4,17},{3489660928u,4,7},{3221225472u,4,11},{3154116608u,6,1},{3087007744u,6,23},{3053453312u,7,4},{3019898880u,7,20},{2986344448u,7,0},{2952790016u,7,24},{2818572288u,5,22},{2684354560u,5,10},{2147483648u,3,12},{2013265920u,5,2},{1879048192u,5,14},{1610612736u,4,6},{1342177280u,4,18},{1073741824u,4,8},{805306368u,4,16},{671088640u,5,9},{536870912u,5,5},{402653184u,5,15},{268435456u,5,21},{134217728u,5,19},{0u,5,3},},
|
||||
{{4160749568u,5,18},{4026531840u,5,6},{3892314112u,5,8},{3875536896u,8,3},{3871342592u,10,24},{3867148288u,10,4},{3862953984u,10,0},{3858759680u,10,20},{3825205248u,7,23},{3791650816u,7,1},{3758096384u,7,19},{3623878656u,5,16},{3590324224u,7,15},{3556769792u,7,21},{3523215360u,7,9},{3489660928u,7,5},{3422552064u,6,2},{3355443200u,6,10},{3288334336u,6,14},{3221225472u,6,22},{2147483648u,2,12},{1610612736u,3,13},{1073741824u,3,17},{536870912u,3,11},{0u,3,7},},
|
||||
};
|
||||
static const HuffmanTyp mpc_table_HuffQ3 [2] [ 7] = {
|
||||
static const HuffmanTyp mpc_table_HuffQ3 [2] [ 7] ICONST_ATTR = {
|
||||
{{3758096384u,3,1},{3489660928u,4,3},{3221225472u,4,-3},{2684354560u,3,2},{2147483648u,3,-2},{1073741824u,2,0},{0u,2,-1},},
|
||||
{{3221225472u,2,0},{2147483648u,2,-1},{1073741824u,2,1},{805306368u,4,-2},{671088640u,5,3},{536870912u,5,-3},{0u,3,2},},
|
||||
};
|
||||
static const HuffmanTyp mpc_table_HuffQ4 [2] [ 9] = {
|
||||
static const HuffmanTyp mpc_table_HuffQ4 [2] [ 9] ICONST_ATTR = {
|
||||
{{3758096384u,3,0},{3221225472u,3,-1},{2684354560u,3,1},{2147483648u,3,-2},{1610612736u,3,2},{1342177280u,4,-4},{1073741824u,4,4},{536870912u,3,3},{0u,3,-3},},
|
||||
{{3758096384u,3,1},{3489660928u,4,2},{3221225472u,4,-3},{2147483648u,2,0},{1610612736u,3,-2},{1342177280u,4,3},{1207959552u,5,-4},{1073741824u,5,4},{0u,2,-1},},
|
||||
};
|
||||
static const HuffmanTyp mpc_table_HuffQ5 [2] [15] = {
|
||||
static const HuffmanTyp mpc_table_HuffQ5 [2] [15] ICONST_ATTR = {
|
||||
{{4026531840u,4,2},{3892314112u,5,5},{3825205248u,6,-7},{3758096384u,6,7},{3489660928u,4,-3},{3221225472u,4,3},{3087007744u,5,-6},{2952790016u,5,6},{2684354560u,4,-4},{2415919104u,4,4},{2147483648u,4,-5},{1610612736u,3,0},{1073741824u,3,-1},{536870912u,3,1},{0u,3,-2},},
|
||||
{{4026531840u,4,3},{3892314112u,5,4},{3858759680u,7,6},{3841982464u,8,-7},{3825205248u,8,7},{3758096384u,6,-6},{3221225472u,3,0},{2684354560u,3,-1},{2147483648u,3,1},{1610612736u,3,-2},{1073741824u,3,2},{939524096u,5,-5},{805306368u,5,5},{536870912u,4,-4},{0u,3,-3},},
|
||||
};
|
||||
static const HuffmanTyp mpc_table_HuffQ6 [2] [31] = {
|
||||
static const HuffmanTyp mpc_table_HuffQ6 [2] [31] ICONST_ATTR = {
|
||||
{{4160749568u,5,3},{4026531840u,5,-4},{3959422976u,6,-11},{3892314112u,6,12},{3758096384u,5,4},{3623878656u,5,6},{3489660928u,5,-5},{3355443200u,5,5},{3221225472u,5,7},{3087007744u,5,-7},{3019898880u,6,-12},{2952790016u,6,-13},{2818572288u,5,-6},{2684354560u,5,8},{2550136832u,5,-8},{2415919104u,5,9},{2281701376u,5,-9},{2214592512u,6,13},{2181038080u,7,-15},{2147483648u,7,15},{1879048192u,4,0},{1744830464u,5,-10},{1610612736u,5,10},{1342177280u,4,-1},{1073741824u,4,2},{805306368u,4,1},{536870912u,4,-2},{469762048u,6,14},{402653184u,6,-14},{268435456u,5,11},{0u,4,-3},},
|
||||
{{4160749568u,5,-6},{4026531840u,5,6},{3758096384u,4,1},{3489660928u,4,-1},{3456106496u,7,10},{3422552064u,7,-10},{3405774848u,8,-11},{3397386240u,9,-12},{3395289088u,11,13},{3394764800u,13,15},{3394240512u,13,-14},{3393716224u,13,14},{3393191936u,13,-15},{3388997632u,10,-13},{3372220416u,8,11},{3355443200u,8,12},{3288334336u,6,-9},{3221225472u,6,9},{2952790016u,4,-2},{2684354560u,4,2},{2415919104u,4,3},{2147483648u,4,-3},{2013265920u,5,-7},{1879048192u,5,7},{1610612736u,4,-4},{1342177280u,4,4},{1207959552u,5,-8},{1073741824u,5,8},{805306368u,4,5},{536870912u,4,-5},{0u,3,0},},
|
||||
};
|
||||
static const HuffmanTyp mpc_table_HuffQ7 [2] [63] = {
|
||||
static const HuffmanTyp mpc_table_HuffQ7 [2] [63] ICONST_ATTR = {
|
||||
{{4227858432u,6,7},{4160749568u,6,8},{4093640704u,6,9},{4026531840u,6,-8},{3959422976u,6,11},{3925868544u,7,21},{3909091328u,8,-28},{3892314112u,8,28},{3825205248u,6,-9},{3791650816u,7,-22},{3758096384u,7,-21},{3690987520u,6,-10},{3623878656u,6,-11},{3556769792u,6,10},{3489660928u,6,12},{3422552064u,6,-13},{3388997632u,7,22},{3355443200u,7,23},{3288334336u,6,-12},{3221225472u,6,13},{3154116608u,6,14},{3087007744u,6,-14},{3053453312u,7,-23},{3036676096u,8,-29},{3019898880u,8,29},{2952790016u,6,-15},{2885681152u,6,15},{2818572288u,6,16},{2751463424u,6,-16},{2717908992u,7,-24},{2684354560u,7,24},{2617245696u,6,17},{2583691264u,7,-25},{2566914048u,8,-30},{2550136832u,8,30},{2483027968u,6,-17},{2415919104u,6,18},{2348810240u,6,-18},{2315255808u,7,25},{2281701376u,7,26},{2214592512u,6,19},{2181038080u,7,-26},{2147483648u,7,-27},{2013265920u,5,2},{1946157056u,6,-19},{1879048192u,6,20},{1744830464u,5,-1},{1728053248u,8,-31},{1711276032u,8,31},{1677721600u,7,27},{1610612736u,6,-20},{1476395008u,5,1},{1342177280u,5,-5},{1207959552u,5,-3},{1073741824u,5,3},{939524096u,5,0},{805306368u,5,-2},{671088640u,5,-4},{536870912u,5,4},{402653184u,5,5},{268435456u,5,-6},{134217728u,5,6},{0u,5,-7},},
|
||||
{{4160749568u,5,-1},{4026531840u,5,2},{3892314112u,5,-2},{3758096384u,5,3},{3741319168u,8,-20},{3737124864u,10,24},{3736862720u,14,28},{3736600576u,14,-28},{3736338432u,14,-30},{3736076288u,14,30},{3735027712u,12,-27},{3734765568u,14,29},{3734503424u,14,-29},{3734241280u,14,31},{3733979136u,14,-31},{3732930560u,12,27},{3724541952u,9,-22},{3690987520u,7,-17},{3623878656u,6,-11},{3489660928u,5,-3},{3355443200u,5,4},{3221225472u,5,-4},{3187671040u,7,17},{3170893824u,8,20},{3162505216u,9,22},{3158310912u,10,-25},{3154116608u,10,-26},{3087007744u,6,12},{2952790016u,5,5},{2818572288u,5,-5},{2684354560u,5,6},{2550136832u,5,-6},{2483027968u,6,-12},{2449473536u,7,-18},{2415919104u,7,18},{2348810240u,6,13},{2281701376u,6,-13},{2147483648u,5,-7},{2080374784u,6,14},{2063597568u,8,21},{2046820352u,8,-21},{2013265920u,7,-19},{1879048192u,5,7},{1744830464u,5,8},{1677721600u,6,-14},{1610612736u,6,-15},{1476395008u,5,-8},{1409286144u,6,15},{1375731712u,7,19},{1371537408u,10,25},{1367343104u,10,26},{1358954496u,9,-23},{1350565888u,9,23},{1342177280u,9,-24},{1207959552u,5,-9},{1073741824u,5,9},{1006632960u,6,16},{939524096u,6,-16},{805306368u,5,10},{536870912u,4,0},{402653184u,5,-10},{268435456u,5,11},{0u,4,1},},
|
||||
};
|
||||
|
|
|
@ -54,6 +54,10 @@ mpc_uint32_t mpc_swap32(mpc_uint32_t val) {
|
|||
}
|
||||
#endif
|
||||
|
||||
#ifndef min
|
||||
#define min(a, b) (((a) < (b)) ? (a) : (b))
|
||||
#endif
|
||||
|
||||
/// Searches for a ID3v2-tag and reads the length (in bytes) of it.
|
||||
/// \param reader supplying raw stream data
|
||||
/// \return size of tag, in bytes
|
||||
|
|
File diff suppressed because it is too large
Load diff
|
@ -132,6 +132,12 @@ mpc_bool_t mpc_decoder_seek_sample(mpc_decoder *d, mpc_int64_t destsample);
|
|||
/// Seeks to specified position in seconds in the source stream.
|
||||
mpc_bool_t mpc_decoder_seek_seconds(mpc_decoder *d, double seconds);
|
||||
|
||||
/// Sets the static seek table pointer.
|
||||
void mpc_decoder_set_seek_table(mpc_decoder *d, mpc_uint32_t *seek_table, mpc_uint32_t max_table_size);
|
||||
|
||||
/// Cleans up the decoder
|
||||
void mpc_decoder_destroy(mpc_decoder *d);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif // __cplusplus
|
||||
|
|
|
@ -334,6 +334,7 @@ static void Synthese_Filter_float_internal(MPC_SAMPLE_FORMAT * OutData,MPC_SAMPL
|
|||
for ( n = 0; n < 36; n++, Y += 32 ) {
|
||||
V -= 64;
|
||||
Calculate_New_V ( Y, V );
|
||||
if (OutData != NULL)
|
||||
{
|
||||
MPC_SAMPLE_FORMAT * Data = OutData;
|
||||
const MPC_SAMPLE_FORMAT * D = (const MPC_SAMPLE_FORMAT *) &Di_opt;
|
||||
|
@ -429,7 +430,7 @@ static void Synthese_Filter_float_internal(MPC_SAMPLE_FORMAT * OutData,MPC_SAMPL
|
|||
, 1);
|
||||
|
||||
Data += 1;
|
||||
#endif
|
||||
#endif
|
||||
}
|
||||
V -= 32;//bleh
|
||||
OutData+=32;
|
||||
|
@ -452,7 +453,7 @@ mpc_decoder_synthese_filter_float(mpc_decoder *d, MPC_SAMPLE_FORMAT* OutData)
|
|||
memmove(d->V_R + MPC_V_MEM, d->V_R, 960 * sizeof(MPC_SAMPLE_FORMAT) );
|
||||
|
||||
Synthese_Filter_float_internal(
|
||||
OutData + MPC_FRAME_LENGTH,
|
||||
(OutData == NULL ? NULL : OutData + MPC_FRAME_LENGTH),
|
||||
(MPC_SAMPLE_FORMAT *)(d->V_R + MPC_V_MEM),
|
||||
(MPC_SAMPLE_FORMAT *)(d->Y_R [0]));
|
||||
}
|
||||
|
|
|
@ -22,7 +22,7 @@
|
|||
|
||||
CODEC_HEADER
|
||||
|
||||
mpc_decoder decoder;
|
||||
mpc_decoder decoder IBSS_ATTR;
|
||||
|
||||
/* Our implementations of the mpc_reader callback functions. */
|
||||
mpc_int32_t read_impl(void *data, void *ptr, mpc_int32_t size)
|
||||
|
@ -63,7 +63,8 @@ mpc_bool_t canseek_impl(void *data)
|
|||
return true;
|
||||
}
|
||||
|
||||
MPC_SAMPLE_FORMAT sample_buffer[MPC_DECODER_BUFFER_LENGTH] IBSS_ATTR;
|
||||
MPC_SAMPLE_FORMAT sample_buffer[MPC_DECODER_BUFFER_LENGTH];
|
||||
mpc_uint32_t seek_table[10000];
|
||||
|
||||
#ifdef USE_IRAM
|
||||
extern char iramcopy[];
|
||||
|
@ -92,6 +93,7 @@ enum codec_status codec_start(struct codec_api *api)
|
|||
ci->configure(DSP_DITHER, (bool *)false);
|
||||
ci->configure(DSP_SET_SAMPLE_DEPTH, (long *)(28));
|
||||
ci->configure(CODEC_SET_FILEBUF_CHUNKSIZE, (long *)(1024*16));
|
||||
ci->configure(CODEC_SET_FILEBUF_PRESEEK, (long *)(0));
|
||||
|
||||
/* Create a decoder instance */
|
||||
reader.read = read_impl;
|
||||
|
@ -101,6 +103,11 @@ enum codec_status codec_start(struct codec_api *api)
|
|||
reader.canseek = canseek_impl;
|
||||
reader.data = ci;
|
||||
|
||||
/* Ensure that SeekTable is clear since decoder is reused */
|
||||
decoder.SeekTable = NULL;
|
||||
|
||||
mpc_decoder_set_seek_table(&decoder, seek_table, sizeof(seek_table));
|
||||
|
||||
next_track:
|
||||
if (codec_init(api)) {
|
||||
retval = CODEC_ERROR;
|
||||
|
@ -113,7 +120,7 @@ next_track:
|
|||
retval = CODEC_ERROR;
|
||||
goto done;
|
||||
}
|
||||
frequency = info.sample_freq;
|
||||
frequency = info.sample_freq / 1000;
|
||||
ci->configure(DSP_SET_FREQUENCY, (long *)(long)info.sample_freq);
|
||||
|
||||
/* set playback engine up for correct number of channels */
|
||||
|
@ -139,21 +146,23 @@ next_track:
|
|||
/* This is the decoding loop. */
|
||||
samplesdone = 0;
|
||||
do {
|
||||
#if 0
|
||||
/* Complete seek handler. This will be extremely slow and unresponsive
|
||||
on target, so has been disabledt. */
|
||||
#if 1
|
||||
/* Complete seek handler. */
|
||||
if (ci->seek_time) {
|
||||
mpc_int64_t new_offset = (ci->seek_time - 1)*info.sample_freq/1000;
|
||||
/* hack to improve seek time if filebuf goes empty */
|
||||
ci->configure(CODEC_SET_FILEBUF_CHUNKSIZE, (long *)(1024*512));
|
||||
mpc_int64_t new_offset = (ci->seek_time - 1)*frequency;
|
||||
if (mpc_decoder_seek_sample(&decoder, new_offset)) {
|
||||
samplesdone = new_offset;
|
||||
ci->set_elapsed(ci->seek_time);
|
||||
}
|
||||
ci->seek_complete();
|
||||
/* reset chunksize */
|
||||
ci->configure(CODEC_SET_FILEBUF_CHUNKSIZE, (long *)(1024*16));
|
||||
|
||||
}
|
||||
#else
|
||||
/* Seek to start of track handler. This is the only case that isn't slow
|
||||
as hell, and needs to be supported for the back button to function as
|
||||
wanted. */
|
||||
/* Seek to start of track handler. */
|
||||
if (ci->seek_time) {
|
||||
if (ci->seek_time == 1 && mpc_decoder_seek_sample(&decoder, 0)) {
|
||||
samplesdone = 0;
|
||||
|
@ -178,7 +187,7 @@ next_track:
|
|||
status*sizeof(MPC_SAMPLE_FORMAT)))
|
||||
ci->yield();
|
||||
samplesdone += status;
|
||||
ci->set_elapsed(samplesdone/(frequency/1000));
|
||||
ci->set_elapsed(samplesdone/frequency);
|
||||
}
|
||||
} while (status != 0);
|
||||
retval = CODEC_OK;
|
||||
|
@ -188,6 +197,7 @@ done:
|
|||
goto next_track;
|
||||
|
||||
exit:
|
||||
mpc_decoder_destroy(&decoder);
|
||||
return retval;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue