mirror of
https://github.com/hajimehoshi/ebiten.git
synced 2025-01-23 09:22:01 +01:00
audio/mp3: Move main_data_* to Go
This commit is contained in:
parent
3e76a77e6b
commit
5dd91f6c83
@ -60,19 +60,6 @@ func Get_Byte() C.unsigned {
|
|||||||
return C.unsigned(b)
|
return C.unsigned(b)
|
||||||
}
|
}
|
||||||
|
|
||||||
//export Get_Bytes
|
|
||||||
func Get_Bytes(num C.unsigned, data *C.unsigned) C.unsigned {
|
|
||||||
s := C.unsigned(0)
|
|
||||||
for i := 0; i < int(num); i++ {
|
|
||||||
v := Get_Byte()
|
|
||||||
if v == eof {
|
|
||||||
return eof
|
|
||||||
}
|
|
||||||
*(*C.unsigned)(unsafe.Pointer(uintptr(unsafe.Pointer(data)) + uintptr(i)*unsafe.Sizeof(s))) = v
|
|
||||||
}
|
|
||||||
return C.OK
|
|
||||||
}
|
|
||||||
|
|
||||||
func getBytes(num int) ([]int, error) {
|
func getBytes(num int) ([]int, error) {
|
||||||
r := make([]int, num)
|
r := make([]int, num)
|
||||||
for i := 0; i < num; i++ {
|
for i := 0; i < num; i++ {
|
||||||
|
137
audio/mp3/maindata.go
Normal file
137
audio/mp3/maindata.go
Normal file
@ -0,0 +1,137 @@
|
|||||||
|
// Copyright 2017 The Ebiten Authors
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
|
||||||
|
// +build !js
|
||||||
|
|
||||||
|
package mp3
|
||||||
|
|
||||||
|
// #include "pdmp3.h"
|
||||||
|
import "C"
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
)
|
||||||
|
|
||||||
|
/* Bit reservoir for main data */
|
||||||
|
type mainData struct {
|
||||||
|
// Large static data
|
||||||
|
vec [2 * 1024]int
|
||||||
|
// Pointer into the reservoir
|
||||||
|
ptr []int
|
||||||
|
// Index into the current byte(0-7)
|
||||||
|
idx int
|
||||||
|
// Number of bytes in reservoir(0-1024)
|
||||||
|
top int
|
||||||
|
|
||||||
|
pos int
|
||||||
|
}
|
||||||
|
|
||||||
|
var theMainData mainData
|
||||||
|
|
||||||
|
//export Get_Main_Data
|
||||||
|
func Get_Main_Data(size C.unsigned, begin C.unsigned) C.int {
|
||||||
|
if size > 1500 {
|
||||||
|
g_error = fmt.Errorf("size = %d", size)
|
||||||
|
}
|
||||||
|
/* Check that there's data available from previous frames if needed */
|
||||||
|
if int(begin) > theMainData.top {
|
||||||
|
// No,there is not,so we skip decoding this frame,but we have to
|
||||||
|
// read the main_data bits from the bitstream in case they are needed
|
||||||
|
// for decoding the next frame.
|
||||||
|
b, err := getBytes(int(size))
|
||||||
|
if err != nil {
|
||||||
|
g_error = err
|
||||||
|
return C.ERROR
|
||||||
|
}
|
||||||
|
copy(theMainData.vec[theMainData.top:], b)
|
||||||
|
/* Set up pointers */
|
||||||
|
theMainData.ptr = theMainData.vec[0:]
|
||||||
|
theMainData.pos = 0
|
||||||
|
theMainData.idx = 0
|
||||||
|
theMainData.top += int(size)
|
||||||
|
return C.ERROR
|
||||||
|
}
|
||||||
|
/* Copy data from previous frames */
|
||||||
|
for i := 0; i < int(begin); i++ {
|
||||||
|
theMainData.vec[i] = theMainData.vec[theMainData.top-int(begin)+i]
|
||||||
|
}
|
||||||
|
/* Read the main_data from file */
|
||||||
|
b, err := getBytes(int(size))
|
||||||
|
if err != nil {
|
||||||
|
g_error = err
|
||||||
|
return C.ERROR
|
||||||
|
}
|
||||||
|
copy(theMainData.vec[begin:], b)
|
||||||
|
/* Set up pointers */
|
||||||
|
theMainData.ptr = theMainData.vec[0:]
|
||||||
|
theMainData.pos = 0
|
||||||
|
theMainData.idx = 0
|
||||||
|
theMainData.top = int(begin) + int(size)
|
||||||
|
return C.OK
|
||||||
|
}
|
||||||
|
|
||||||
|
//export Get_Main_Bit
|
||||||
|
func Get_Main_Bit() C.unsigned {
|
||||||
|
tmp := uint(theMainData.ptr[0]) >> (7 - uint(theMainData.idx))
|
||||||
|
tmp &= 0x01
|
||||||
|
theMainData.ptr = theMainData.ptr[(theMainData.idx+1)>>3:]
|
||||||
|
theMainData.pos += (theMainData.idx + 1) >> 3
|
||||||
|
theMainData.idx = (theMainData.idx + 1) & 0x07
|
||||||
|
return C.unsigned(tmp)
|
||||||
|
}
|
||||||
|
|
||||||
|
//export Get_Main_Bits
|
||||||
|
func Get_Main_Bits(num C.unsigned) C.unsigned {
|
||||||
|
if num == 0 {
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
/* Form a word of the next four bytes */
|
||||||
|
b := make([]int, 4)
|
||||||
|
for i := range b {
|
||||||
|
if len(theMainData.ptr) > i {
|
||||||
|
b[i] = theMainData.ptr[i]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
tmp := (uint32(b[0]) << 24) | (uint32(b[1]) << 16) | (uint32(b[2]) << 8) | (uint32(b[3]) << 0)
|
||||||
|
|
||||||
|
/* Remove bits already used */
|
||||||
|
tmp = tmp << uint(theMainData.idx)
|
||||||
|
|
||||||
|
/* Remove bits after the desired bits */
|
||||||
|
tmp = tmp >> (32 - num)
|
||||||
|
|
||||||
|
/* Update pointers */
|
||||||
|
theMainData.ptr = theMainData.ptr[(theMainData.idx+int(num))>>3:]
|
||||||
|
theMainData.pos += (theMainData.idx + int(num)) >> 3
|
||||||
|
theMainData.idx = (theMainData.idx + int(num)) & 0x07
|
||||||
|
|
||||||
|
/* Done */
|
||||||
|
return C.unsigned(tmp)
|
||||||
|
}
|
||||||
|
|
||||||
|
//export Get_Main_Pos
|
||||||
|
func Get_Main_Pos() C.unsigned {
|
||||||
|
pos := theMainData.pos
|
||||||
|
pos *= 8 /* Multiply by 8 to get number of bits */
|
||||||
|
pos += theMainData.idx /* Add current bit index */
|
||||||
|
return C.unsigned(pos)
|
||||||
|
}
|
||||||
|
|
||||||
|
//export Set_Main_Pos
|
||||||
|
func Set_Main_Pos(bit_pos C.unsigned) C.int {
|
||||||
|
theMainData.ptr = theMainData.vec[bit_pos>>3:]
|
||||||
|
theMainData.pos = int(bit_pos) >> 3
|
||||||
|
theMainData.idx = int(bit_pos) & 0x7
|
||||||
|
return C.OK
|
||||||
|
}
|
@ -109,14 +109,10 @@ static void dmp_samples(t_mpeg1_main_data *md,int gr,int ch,int type);
|
|||||||
#define dmp_samples(...) do{}while(0)
|
#define dmp_samples(...) do{}while(0)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static int Get_Main_Data(unsigned main_data_size,unsigned main_data_begin);
|
|
||||||
static int Read_Audio_L3(void);
|
static int Read_Audio_L3(void);
|
||||||
static int Read_CRC(void);
|
static int Read_CRC(void);
|
||||||
static int Read_Header(void) ;
|
static int Read_Header(void) ;
|
||||||
static int Read_Main_L3(void);
|
static int Read_Main_L3(void);
|
||||||
static int Set_Main_Pos(unsigned bit_pos);
|
|
||||||
|
|
||||||
static unsigned Get_Main_Pos(void);
|
|
||||||
|
|
||||||
static void audio_write(unsigned *samples,unsigned nsamples,int sample_rate);
|
static void audio_write(unsigned *samples,unsigned nsamples,int sample_rate);
|
||||||
static void audio_write_raw(unsigned *samples,unsigned nsamples);
|
static void audio_write_raw(unsigned *samples,unsigned nsamples);
|
||||||
@ -456,12 +452,7 @@ static const float ci[8]={-0.6,-0.535,-0.33,-0.185,-0.095,-0.041,-0.0142,-0.0037
|
|||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
static unsigned hsynth_init = 1,synth_init = 1,
|
static unsigned hsynth_init = 1,synth_init = 1;
|
||||||
/* Bit reservoir for main data */
|
|
||||||
g_main_data_vec[2*1024],/* Large static data */
|
|
||||||
*g_main_data_ptr,/* Pointer into the reservoir */
|
|
||||||
g_main_data_idx,/* Index into the current byte(0-7) */
|
|
||||||
g_main_data_top = 0;/* Number of bytes in reservoir(0-1024) */
|
|
||||||
|
|
||||||
/* Scale factor band indices
|
/* Scale factor band indices
|
||||||
*
|
*
|
||||||
@ -659,43 +650,6 @@ int Decode_L3(void){
|
|||||||
return(OK); /* Done */
|
return(OK); /* Done */
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Description: This function assembles the main data buffer with data from
|
|
||||||
* this frame and the previous two frames into a local buffer
|
|
||||||
* used by the Get_Main_Bits function.
|
|
||||||
* Parameters: main_data_begin indicates how many bytes from previous
|
|
||||||
* frames that should be used. main_data_size indicates the number
|
|
||||||
* of data bytes in this frame.
|
|
||||||
* Return value: Status
|
|
||||||
* Author: Krister Lagerström(krister@kmlager.com) **/
|
|
||||||
static int Get_Main_Data(unsigned main_data_size,unsigned main_data_begin){
|
|
||||||
int i,start_pos;
|
|
||||||
|
|
||||||
if(main_data_size > 1500) ERR("main_data_size = %d\n",main_data_size);
|
|
||||||
/* Check that there's data available from previous frames if needed */
|
|
||||||
if(main_data_begin > g_main_data_top) {
|
|
||||||
/* No,there is not,so we skip decoding this frame,but we have to
|
|
||||||
* read the main_data bits from the bitstream in case they are needed
|
|
||||||
* for decoding the next frame. */
|
|
||||||
(void) Get_Bytes(main_data_size,&(g_main_data_vec[g_main_data_top]));
|
|
||||||
/* Set up pointers */
|
|
||||||
g_main_data_ptr = &(g_main_data_vec[0]);
|
|
||||||
g_main_data_idx = 0;
|
|
||||||
g_main_data_top += main_data_size;
|
|
||||||
return(ERROR); /* This frame cannot be decoded! */
|
|
||||||
}
|
|
||||||
for(i = 0; i < main_data_begin; i++) { /* Copy data from previous frames */
|
|
||||||
g_main_data_vec[i] = g_main_data_vec[g_main_data_top - main_data_begin + i];
|
|
||||||
}
|
|
||||||
start_pos = Get_Filepos();
|
|
||||||
/* Read the main_data from file */
|
|
||||||
(void) Get_Bytes(main_data_size,&(g_main_data_vec[main_data_begin]));
|
|
||||||
/* Set up pointers */
|
|
||||||
g_main_data_ptr = &(g_main_data_vec[0]);
|
|
||||||
g_main_data_idx = 0;
|
|
||||||
g_main_data_top = main_data_begin + main_data_size;
|
|
||||||
return(OK); /* Done */
|
|
||||||
}
|
|
||||||
|
|
||||||
/**Description: Reads audio and main data from bitstream into a buffer. main
|
/**Description: Reads audio and main data from bitstream into a buffer. main
|
||||||
* data is taken from this frame and up to 2 previous frames.
|
* data is taken from this frame and up to 2 previous frames.
|
||||||
* Parameters: None
|
* Parameters: None
|
||||||
@ -1013,77 +967,6 @@ static int Read_Main_L3(void){
|
|||||||
return(OK); /* Done */
|
return(OK); /* Done */
|
||||||
}
|
}
|
||||||
|
|
||||||
/**Description: sets position of next bit to be read from main data bitstream.
|
|
||||||
* Parameters: Bit position. 0 = start,8 = start of byte 1,etc.
|
|
||||||
* Return value: OK or ERROR if bit_pos is past end of main data for this frame.
|
|
||||||
* Author: Krister Lagerström(krister@kmlager.com) **/
|
|
||||||
static int Set_Main_Pos(unsigned bit_pos){
|
|
||||||
|
|
||||||
g_main_data_ptr = &(g_main_data_vec[bit_pos >> 3]);
|
|
||||||
g_main_data_idx = bit_pos & 0x7;
|
|
||||||
|
|
||||||
return(OK);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
/**Description: gets one bit from the local buffer which contains main_data.
|
|
||||||
* Parameters: None
|
|
||||||
* Return value: The bit is returned in the LSB of the return value.
|
|
||||||
* Author: Krister Lagerström(krister@kmlager.com) **/
|
|
||||||
unsigned Get_Main_Bit(void){
|
|
||||||
unsigned tmp;
|
|
||||||
|
|
||||||
tmp = g_main_data_ptr[0] >>(7 - g_main_data_idx);
|
|
||||||
tmp &= 0x01;
|
|
||||||
g_main_data_ptr +=(g_main_data_idx + 1) >> 3;
|
|
||||||
g_main_data_idx =(g_main_data_idx + 1) & 0x07;
|
|
||||||
return(tmp); /* Done */
|
|
||||||
}
|
|
||||||
|
|
||||||
/**Description: reads 'number_of_bits' from local buffer containing main_data.
|
|
||||||
* Parameters: number_of_bits to read(max 24)
|
|
||||||
* Return value: The bits are returned in the LSB of the return value.
|
|
||||||
*
|
|
||||||
******************************************************************************/
|
|
||||||
unsigned Get_Main_Bits(unsigned number_of_bits){
|
|
||||||
unsigned tmp;
|
|
||||||
|
|
||||||
|
|
||||||
if(number_of_bits == 0) return(0);
|
|
||||||
|
|
||||||
/* Form a word of the next four bytes */
|
|
||||||
tmp =(g_main_data_ptr[0] << 24) |(g_main_data_ptr[1] << 16) |
|
|
||||||
(g_main_data_ptr[2] << 8) |(g_main_data_ptr[3] << 0);
|
|
||||||
|
|
||||||
/* Remove bits already used */
|
|
||||||
tmp = tmp << g_main_data_idx;
|
|
||||||
|
|
||||||
/* Remove bits after the desired bits */
|
|
||||||
tmp = tmp >>(32 - number_of_bits);
|
|
||||||
|
|
||||||
/* Update pointers */
|
|
||||||
g_main_data_ptr +=(g_main_data_idx + number_of_bits) >> 3;
|
|
||||||
g_main_data_idx =(g_main_data_idx + number_of_bits) & 0x07;
|
|
||||||
|
|
||||||
/* Done */
|
|
||||||
return(tmp);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
/**Description: returns pos. of next bit to be read from main data bitstream.
|
|
||||||
* Parameters: None
|
|
||||||
* Return value: Bit position.
|
|
||||||
* Author: Krister Lagerström(krister@kmlager.com) **/
|
|
||||||
static unsigned Get_Main_Pos(void){
|
|
||||||
unsigned pos;
|
|
||||||
|
|
||||||
pos =((size_t) g_main_data_ptr) -((size_t) &(g_main_data_vec[0]));
|
|
||||||
pos /= 4; /* Divide by four to get number of bytes */
|
|
||||||
pos *= 8; /* Multiply by 8 to get number of bits */
|
|
||||||
pos += g_main_data_idx; /* Add current bit index */
|
|
||||||
return(pos);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**Description: TBD
|
/**Description: TBD
|
||||||
* Parameters: TBD
|
* Parameters: TBD
|
||||||
* Return value: TBD
|
* Return value: TBD
|
||||||
@ -1099,7 +982,7 @@ static void Error(const char *s,int e){
|
|||||||
* Author: Krister Lagerström(krister@kmlager.com) **/
|
* Author: Krister Lagerström(krister@kmlager.com) **/
|
||||||
static void Decode_L3_Init_Song(void){
|
static void Decode_L3_Init_Song(void){
|
||||||
hsynth_init = synth_init = 1;
|
hsynth_init = synth_init = 1;
|
||||||
g_main_data_top = 0; /* Clear bit reservoir */
|
//g_main_data_top = 0; /* Clear bit reservoir */
|
||||||
}
|
}
|
||||||
|
|
||||||
/**Description: Does inverse modified DCT and windowing.
|
/**Description: Does inverse modified DCT and windowing.
|
||||||
|
@ -21,8 +21,14 @@ int Decode_L3(void);
|
|||||||
int Read_Frame(void);
|
int Read_Frame(void);
|
||||||
size_t writeToWriter(void* data, int size);
|
size_t writeToWriter(void* data, int size);
|
||||||
|
|
||||||
|
int Get_Main_Data(unsigned main_data_size,unsigned main_data_begin);
|
||||||
unsigned Get_Main_Bit(void);
|
unsigned Get_Main_Bit(void);
|
||||||
unsigned Get_Main_Bits(unsigned number_of_bits);
|
unsigned Get_Main_Bits(unsigned number_of_bits);
|
||||||
|
unsigned Get_Main_Pos(void);
|
||||||
|
int Set_Main_Pos(unsigned bit_pos);
|
||||||
|
unsigned Get_Main_Bit(void);
|
||||||
|
unsigned Get_Main_Bits(unsigned number_of_bits);
|
||||||
|
|
||||||
void Get_Sideinfo(unsigned sideinfo_size);
|
void Get_Sideinfo(unsigned sideinfo_size);
|
||||||
unsigned Get_Side_Bits(unsigned number_of_bits);
|
unsigned Get_Side_Bits(unsigned number_of_bits);
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user