0170f7ccfb9546734b56b3f213be0f4301ae1da1
2 ** Copyright (C) 2008-2011 Erik de Castro Lopo <erikd@mega-nerd.com>
4 ** This program is free software; you can redistribute it and/or modify
5 ** it under the terms of the GNU Lesser General Public License as published by
6 ** the Free Software Foundation; either version 2.1 of the License, or
7 ** (at your option) any later version.
9 ** This program is distributed in the hope that it will be useful,
10 ** but WITHOUT ANY WARRANTY; without even the implied warranty of
11 ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 ** GNU Lesser General Public License for more details.
14 ** You should have received a copy of the GNU Lesser General Public License
15 ** along with this program; if not, write to the Free Software
16 ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
31 ** Info from Olivier Tristan <o.tristan@ultimatesoundbank.com>
34 ** 2 magic bytes: 1 and 4.
35 ** 17 char for the name of the sample.
36 ** 3 bytes: level, tune and channels (0 for channels is mono while 1 is stereo)
37 ** 4 uint32: sampleStart, loopEnd, sampleFrames and loopLength
38 ** 1 byte: loopMode (0 no loop, 1 forward looping)
39 ** 1 byte: number of beat in loop
40 ** 1 uint16: sampleRate
43 ** Data are always non compressed 16 bits interleaved
46 #define HEADER_LENGTH 42 /* Sum of above data fields. */
47 #define HEADER_NAME_LEN 17 /* Length of name string. */
49 #define SFE_MPC_NO_MARKER 666
51 /*------------------------------------------------------------------------------
52 ** Private static functions.
55 static int mpc2k_close (SF_PRIVATE
*psf
) ;
57 static int mpc2k_write_header (SF_PRIVATE
*psf
, int calc_length
) ;
58 static int mpc2k_read_header (SF_PRIVATE
*psf
) ;
60 /*------------------------------------------------------------------------------
65 mpc2k_open (SF_PRIVATE
*psf
)
68 if (psf
->file
.mode
== SFM_READ
|| (psf
->file
.mode
== SFM_RDWR
&& psf
->filelength
> 0))
69 { if ((error
= mpc2k_read_header (psf
)))
73 if ((SF_CONTAINER (psf
->sf
.format
)) != SF_FORMAT_MPC2K
)
74 return SFE_BAD_OPEN_FORMAT
;
76 if (psf
->file
.mode
== SFM_WRITE
|| psf
->file
.mode
== SFM_RDWR
)
77 { if (mpc2k_write_header (psf
, SF_FALSE
))
80 psf
->write_header
= mpc2k_write_header
;
83 psf
->container_close
= mpc2k_close
;
85 psf
->blockwidth
= psf
->bytewidth
* psf
->sf
.channels
;
87 error
= pcm_init (psf
) ;
92 /*------------------------------------------------------------------------------
96 mpc2k_close (SF_PRIVATE
*psf
)
98 if (psf
->file
.mode
== SFM_WRITE
|| psf
->file
.mode
== SFM_RDWR
)
99 mpc2k_write_header (psf
, SF_TRUE
) ;
105 mpc2k_write_header (SF_PRIVATE
*psf
, int calc_length
)
106 { char sample_name
[HEADER_NAME_LEN
+ 1] ;
109 if (psf
->pipeoffset
> 0)
112 current
= psf_ftell (psf
) ;
115 { psf
->filelength
= psf_get_filelen (psf
) ;
117 psf
->dataoffset
= HEADER_LENGTH
;
118 psf
->datalength
= psf
->filelength
- psf
->dataoffset
;
120 psf
->sf
.frames
= psf
->datalength
/ (psf
->bytewidth
* psf
->sf
.channels
) ;
123 /* Reset the current header length to zero. */
124 psf
->header
[0] = 0 ;
128 ** Only attempt to seek if we are not writng to a pipe. If we are
129 ** writing to a pipe we shouldn't be here anyway.
131 if (psf
->is_pipe
== SF_FALSE
)
132 psf_fseek (psf
, 0, SEEK_SET
) ;
134 snprintf (sample_name
, sizeof (sample_name
), "%s ", psf
->file
.name
.c
) ;
136 psf_binheader_writef (psf
, "e11b", 1, 4, sample_name
, make_size_t (HEADER_NAME_LEN
)) ;
137 psf_binheader_writef (psf
, "e111", 100, 0, (psf
->sf
.channels
- 1) & 1) ;
138 psf_binheader_writef (psf
, "et4888", 0, psf
->sf
.frames
, psf
->sf
.frames
, psf
->sf
.frames
) ;
139 psf_binheader_writef (psf
, "e112", 0, 1, (uint16_t) psf
->sf
.samplerate
) ;
141 /* Always 16 bit little endian data. */
143 psf
->endian
= SF_ENDIAN_LITTLE
;
145 psf_fwrite (psf
->header
, psf
->headindex
, 1, psf
) ;
150 psf
->dataoffset
= psf
->headindex
;
153 psf_fseek (psf
, current
, SEEK_SET
) ;
156 } /* mpc2k_write_header */
159 mpc2k_read_header (SF_PRIVATE
*psf
)
160 { char sample_name
[HEADER_NAME_LEN
+ 1] ;
161 unsigned char bytes
[4] ;
162 uint32_t sample_start
, loop_end
, sample_frames
, loop_length
;
163 uint16_t sample_rate
;
165 psf_binheader_readf (psf
, "pebb", 0, bytes
, 2, sample_name
, make_size_t (HEADER_NAME_LEN
)) ;
167 if (bytes
[0] != 1 || bytes
[1] != 4)
168 return SFE_MPC_NO_MARKER
;
170 sample_name
[HEADER_NAME_LEN
] = 0 ;
172 psf_log_printf (psf
, "MPC2000\n Name : %s\n", sample_name
) ;
174 psf_binheader_readf (psf
, "eb4444", bytes
, 3, &sample_start
, &loop_end
, &sample_frames
, &loop_length
) ;
176 psf
->sf
.channels
= bytes
[2] ? 2 : 1 ;
178 psf_log_printf (psf
, " Level : %d\n Tune : %d\n Stereo : %s\n", bytes
[0], bytes
[1], bytes
[2] ? "Yes" : "No") ;
180 psf_log_printf (psf
, " Sample start : %d\n Loop end : %d\n Frames : %d\n Length : %d\n", sample_start
, loop_end
, sample_frames
, loop_length
) ;
182 psf_binheader_readf (psf
, "eb2", bytes
, 2, &sample_rate
) ;
184 psf_log_printf (psf
, " Loop mode : %s\n Beats : %d\n Sample rate : %d\nEnd\n", bytes
[0] ? "None" : "Fwd", bytes
[1], sample_rate
) ;
186 psf
->sf
.samplerate
= sample_rate
;
188 psf
->sf
.format
= SF_FORMAT_MPC2K
| SF_FORMAT_PCM_16
;
190 psf
->dataoffset
= psf_ftell (psf
) ;
192 /* Always 16 bit little endian data. */
194 psf
->endian
= SF_ENDIAN_LITTLE
;
196 psf
->datalength
= psf
->filelength
- psf
->dataoffset
;
197 psf
->blockwidth
= psf
->sf
.channels
* psf
->bytewidth
;
198 psf
->sf
.frames
= psf
->datalength
/ psf
->blockwidth
;
200 psf
->sf
.frames
= (psf
->filelength
- psf
->dataoffset
) / psf
->blockwidth
;
203 } /* mpc2k_read_header */