music_flac.c
上传用户:nini_0081
上传日期:2022-07-21
资源大小:2628k
文件大小:16k
源码类别:

多媒体编程

开发平台:

DOS

  1. /*
  2.     SDL_mixer:  An audio mixer library based on the SDL library
  3.     Copyright (C) 1997-2009 Sam Lantinga
  4.     This library is free software; you can redistribute it and/or
  5.     modify it under the terms of the GNU Library General Public
  6.     License as published by the Free Software Foundation; either
  7.     version 2 of the License, or (at your option) any later version.
  8.     This library is distributed in the hope that it will be useful,
  9.     but WITHOUT ANY WARRANTY; without even the implied warranty of
  10.     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  11.     Library General Public License for more details.
  12.     You should have received a copy of the GNU Library General Public
  13.     License along with this library; if not, write to the Free
  14.     Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  15.     Sam Lantinga
  16.     slouken@libsdl.org
  17.     This file is used to support SDL_LoadMUS playback of FLAC files.
  18.     ~ Austen Dicken (admin@cvpcs.org)
  19. */
  20. #ifdef FLAC_MUSIC
  21. #include <stdio.h>
  22. #include <stdlib.h>
  23. #include <string.h>
  24. #include "SDL_mixer.h"
  25. #include "dynamic_flac.h"
  26. #include "music_flac.h"
  27. /* This is the format of the audio mixer data */
  28. static SDL_AudioSpec mixer;
  29. /* Initialize the FLAC player, with the given mixer settings
  30.    This function returns 0, or -1 if there was an error.
  31.  */
  32. int FLAC_init(SDL_AudioSpec *mixerfmt)
  33. {
  34. mixer = *mixerfmt;
  35. return(0);
  36. }
  37. /* Set the volume for an FLAC stream */
  38. void FLAC_setvolume(FLAC_music *music, int volume)
  39. {
  40. music->volume = volume;
  41. }
  42. /* Load an FLAC stream from the given file */
  43. FLAC_music *FLAC_new(const char *file)
  44. {
  45. SDL_RWops *rw;
  46. rw = SDL_RWFromFile (file, "rb");
  47. if (rw == NULL) {
  48. SDL_SetError ("Couldn't open %s", file);
  49. return NULL;
  50. }
  51. return FLAC_new_RW (rw);
  52. }
  53. static FLAC__StreamDecoderReadStatus flac_read_music_cb(
  54. const FLAC__StreamDecoder *decoder,
  55. FLAC__byte buffer[],
  56. size_t *bytes,
  57. void *client_data)
  58. {
  59. FLAC_music *data = (FLAC_music*)client_data;
  60. // make sure there is something to be reading
  61. if (*bytes > 0) {
  62. *bytes = SDL_RWread (data->rwops, buffer, sizeof (FLAC__byte), *bytes);
  63. if (*bytes < 0) { // error in read
  64. return FLAC__STREAM_DECODER_READ_STATUS_ABORT;
  65. }
  66. else if (*bytes == 0 ) { // no data was read (EOF)
  67. return FLAC__STREAM_DECODER_READ_STATUS_END_OF_STREAM;
  68. }
  69. else { // data was read, continue
  70. return FLAC__STREAM_DECODER_READ_STATUS_CONTINUE;
  71. }
  72. }
  73. else {
  74. return FLAC__STREAM_DECODER_READ_STATUS_ABORT;
  75. }
  76. }
  77. static FLAC__StreamDecoderSeekStatus flac_seek_music_cb(
  78. const FLAC__StreamDecoder *decoder,
  79. FLAC__uint64 absolute_byte_offset,
  80. void *client_data)
  81. {
  82. FLAC_music *data = (FLAC_music*)client_data;
  83. if (SDL_RWseek (data->rwops, absolute_byte_offset, RW_SEEK_SET) < 0) {
  84. return FLAC__STREAM_DECODER_SEEK_STATUS_ERROR;
  85. }
  86. else {
  87. return FLAC__STREAM_DECODER_SEEK_STATUS_OK;
  88. }
  89. }
  90. static FLAC__StreamDecoderTellStatus flac_tell_music_cb(
  91. const FLAC__StreamDecoder *decoder,
  92. FLAC__uint64 *absolute_byte_offset,
  93. void *client_data )
  94. {
  95. FLAC_music *data = (FLAC_music*)client_data;
  96. int pos = SDL_RWtell (data->rwops);
  97. if (pos < 0) {
  98. return FLAC__STREAM_DECODER_TELL_STATUS_ERROR;
  99. }
  100. else {
  101. *absolute_byte_offset = (FLAC__uint64)pos;
  102. return FLAC__STREAM_DECODER_TELL_STATUS_OK;
  103. }
  104. }
  105. static FLAC__StreamDecoderLengthStatus flac_length_music_cb (
  106. const FLAC__StreamDecoder *decoder,
  107. FLAC__uint64 *stream_length,
  108. void *client_data)
  109. {
  110. FLAC_music *data = (FLAC_music*)client_data;
  111. int pos = SDL_RWtell (data->rwops);
  112. int length = SDL_RWseek (data->rwops, 0, RW_SEEK_END);
  113. if (SDL_RWseek (data->rwops, pos, RW_SEEK_SET) != pos || length < 0) {
  114. /* there was an error attempting to return the stream to the original
  115.  * position, or the length was invalid. */
  116. return FLAC__STREAM_DECODER_LENGTH_STATUS_ERROR;
  117. }
  118. else {
  119. *stream_length = (FLAC__uint64)length;
  120. return FLAC__STREAM_DECODER_LENGTH_STATUS_OK;
  121. }
  122. }
  123. static FLAC__bool flac_eof_music_cb(
  124. const FLAC__StreamDecoder *decoder,
  125. void *client_data )
  126. {
  127. FLAC_music *data = (FLAC_music*)client_data;
  128. int pos = SDL_RWtell (data->rwops);
  129. int end = SDL_RWseek (data->rwops, 0, RW_SEEK_END);
  130. // was the original position equal to the end (a.k.a. the seek didn't move)?
  131. if (pos == end) {
  132. // must be EOF
  133. return true;
  134. }
  135. else {
  136. // not EOF, return to the original position
  137. SDL_RWseek (data->rwops, pos, RW_SEEK_SET);
  138. return false;
  139. }
  140. }
  141. static FLAC__StreamDecoderWriteStatus flac_write_music_cb(
  142. const FLAC__StreamDecoder *decoder,
  143. const FLAC__Frame *frame,
  144. const FLAC__int32 *const buffer[],
  145. void *client_data)
  146. {
  147. FLAC_music *data = (FLAC_music *)client_data;
  148. size_t i;
  149. if (data->flac_data.total_samples == 0) {
  150. SDL_SetError ("Given FLAC file does not specify its sample count.");
  151. return FLAC__STREAM_DECODER_WRITE_STATUS_ABORT;
  152. }
  153. if (data->flac_data.channels != 2 ||
  154. data->flac_data.bits_per_sample != 16) {
  155. SDL_SetError("Current FLAC support is only for 16 bit Stereo files.");
  156. return FLAC__STREAM_DECODER_WRITE_STATUS_ABORT;
  157. }
  158. for (i = 0; i < frame->header.blocksize; i++) {
  159. FLAC__int16 i16;
  160. FLAC__uint16 ui16;
  161. // make sure we still have at least two bytes that can be read (one for
  162. // each channel)
  163. if (data->flac_data.max_to_read >= 4) {
  164. // does the data block exist?
  165. if (!data->flac_data.data) {
  166. data->flac_data.data_len = data->flac_data.max_to_read;
  167. data->flac_data.data_read = 0;
  168. // create it
  169. data->flac_data.data =
  170. (char *)malloc (data->flac_data.data_len);
  171. if (!data->flac_data.data) {
  172. return FLAC__STREAM_DECODER_WRITE_STATUS_ABORT;
  173. }
  174. }
  175. i16 = (FLAC__int16)buffer[0][i];
  176. ui16 = (FLAC__uint16)i16;
  177. *((data->flac_data.data) + (data->flac_data.data_read++)) =
  178. (char)(ui16);
  179. *((data->flac_data.data) + (data->flac_data.data_read++)) =
  180. (char)(ui16 >> 8);
  181. i16 = (FLAC__int16)buffer[1][i];
  182. ui16 = (FLAC__uint16)i16;
  183. *((data->flac_data.data) + (data->flac_data.data_read++)) =
  184. (char)(ui16);
  185. *((data->flac_data.data) + (data->flac_data.data_read++)) =
  186. (char)(ui16 >> 8);
  187. data->flac_data.max_to_read -= 4;
  188. if (data->flac_data.max_to_read < 4) {
  189. // we need to set this so that the read halts from the
  190. // FLAC_getsome function.
  191. data->flac_data.max_to_read = 0;
  192. }
  193. }
  194. else {
  195. // we need to write to the overflow
  196. if (!data->flac_data.overflow) {
  197. data->flac_data.overflow_len =
  198. 4 * (frame->header.blocksize - i);
  199. data->flac_data.overflow_read = 0;
  200. // make it big enough for the rest of the block
  201. data->flac_data.overflow =
  202. (char *)malloc (data->flac_data.overflow_len);
  203. if (!data->flac_data.overflow) {
  204. return FLAC__STREAM_DECODER_WRITE_STATUS_ABORT;
  205. }
  206. }
  207. i16 = (FLAC__int16)buffer[0][i];
  208. ui16 = (FLAC__uint16)i16;
  209. *((data->flac_data.overflow) + (data->flac_data.overflow_read++)) =
  210. (char)(ui16);
  211. *((data->flac_data.overflow) + (data->flac_data.overflow_read++)) =
  212. (char)(ui16 >> 8);
  213. i16 = (FLAC__int16)buffer[1][i];
  214. ui16 = (FLAC__uint16)i16;
  215. *((data->flac_data.overflow) + (data->flac_data.overflow_read++)) =
  216. (char)(ui16);
  217. *((data->flac_data.overflow) + (data->flac_data.overflow_read++)) =
  218. (char)(ui16 >> 8);
  219. }
  220. }
  221. return FLAC__STREAM_DECODER_WRITE_STATUS_CONTINUE;
  222. }
  223. static void flac_metadata_music_cb(
  224. const FLAC__StreamDecoder *decoder,
  225. const FLAC__StreamMetadata *metadata,
  226. void *client_data)
  227. {
  228. FLAC_music *data = (FLAC_music *)client_data;
  229. if (metadata->type == FLAC__METADATA_TYPE_STREAMINFO) {
  230. data->flac_data.sample_rate = metadata->data.stream_info.sample_rate;
  231. data->flac_data.channels = metadata->data.stream_info.channels;
  232. data->flac_data.total_samples =
  233. metadata->data.stream_info.total_samples;
  234. data->flac_data.bits_per_sample =
  235. metadata->data.stream_info.bits_per_sample;
  236. data->flac_data.sample_size = data->flac_data.channels *
  237. ((data->flac_data.bits_per_sample) / 8);
  238. }
  239. }
  240. static void flac_error_music_cb(
  241. const FLAC__StreamDecoder *decoder,
  242. FLAC__StreamDecoderErrorStatus status,
  243. void *client_data)
  244. {
  245. // print an SDL error based on the error status
  246. switch (status) {
  247. case FLAC__STREAM_DECODER_ERROR_STATUS_LOST_SYNC:
  248. SDL_SetError ("Error processing the FLAC file [LOST_SYNC].");
  249. break;
  250. case FLAC__STREAM_DECODER_ERROR_STATUS_BAD_HEADER:
  251. SDL_SetError ("Error processing the FLAC file [BAD_HEADER].");
  252. break;
  253. case FLAC__STREAM_DECODER_ERROR_STATUS_FRAME_CRC_MISMATCH:
  254. SDL_SetError ("Error processing the FLAC file [CRC_MISMATCH].");
  255. break;
  256. case FLAC__STREAM_DECODER_ERROR_STATUS_UNPARSEABLE_STREAM:
  257. SDL_SetError ("Error processing the FLAC file [UNPARSEABLE].");
  258. break;
  259. default:
  260. SDL_SetError ("Error processing the FLAC file [UNKNOWN].");
  261. break;
  262. }
  263. }
  264. /* Load an FLAC stream from an SDL_RWops object */
  265. FLAC_music *FLAC_new_RW(SDL_RWops *rw)
  266. {
  267. FLAC_music *music;
  268. int init_stage = 0;
  269. int was_error = 1;
  270. music = (FLAC_music *)malloc ( sizeof (*music));
  271. if (music) {
  272. /* Initialize the music structure */
  273. memset (music, 0, (sizeof (*music)));
  274. FLAC_stop (music);
  275. FLAC_setvolume (music, MIX_MAX_VOLUME);
  276. music->section = -1;
  277. music->rwops = rw;
  278. music->flac_data.max_to_read = 0;
  279. music->flac_data.overflow = NULL;
  280. music->flac_data.overflow_len = 0;
  281. music->flac_data.overflow_read = 0;
  282. music->flac_data.data = NULL;
  283. music->flac_data.data_len = 0;
  284. music->flac_data.data_read = 0;
  285. if (Mix_Init(MIX_INIT_FLAC)) {
  286. init_stage++; // stage 1!
  287. music->flac_decoder = flac.FLAC__stream_decoder_new ();
  288. if (music->flac_decoder != NULL) {
  289. init_stage++; // stage 2!
  290. if (flac.FLAC__stream_decoder_init_stream(
  291. music->flac_decoder,
  292. flac_read_music_cb, flac_seek_music_cb,
  293. flac_tell_music_cb, flac_length_music_cb,
  294. flac_eof_music_cb, flac_write_music_cb,
  295. flac_metadata_music_cb, flac_error_music_cb,
  296. music) == FLAC__STREAM_DECODER_INIT_STATUS_OK ) {
  297. init_stage++; // stage 3!
  298. if (flac.FLAC__stream_decoder_process_until_end_of_metadata
  299. (music->flac_decoder)) {
  300. was_error = 0;
  301. } else {
  302. SDL_SetError("FLAC__stream_decoder_process_until_end_of_metadata() failed");
  303. }
  304. } else {
  305. SDL_SetError("FLAC__stream_decoder_init_stream() failed");
  306. }
  307. } else {
  308. SDL_SetError("FLAC__stream_decoder_new() failed");
  309. }
  310. }
  311. if (was_error) {
  312. switch (init_stage) {
  313. case 3:
  314. flac.FLAC__stream_decoder_finish( music->flac_decoder );
  315. case 2:
  316. flac.FLAC__stream_decoder_delete( music->flac_decoder );
  317. case 1:
  318. case 0:
  319. free(music);
  320. SDL_RWclose(rw);
  321. break;
  322. }
  323. return NULL;
  324. }
  325. }
  326. else {
  327. SDL_OutOfMemory();
  328. }
  329. return music;
  330. }
  331. /* Start playback of a given FLAC stream */
  332. void FLAC_play(FLAC_music *music)
  333. {
  334. music->playing = 1;
  335. }
  336. /* Return non-zero if a stream is currently playing */
  337. int FLAC_playing(FLAC_music *music)
  338. {
  339. return(music->playing);
  340. }
  341. /* Read some FLAC stream data and convert it for output */
  342. static void FLAC_getsome(FLAC_music *music)
  343. {
  344. int section;
  345. SDL_AudioCVT *cvt;
  346. /* GET AUDIO wAVE DATA */
  347. // set the max number of characters to read
  348. music->flac_data.max_to_read = 8192;
  349. // clear out the data buffer if it exists
  350. if (music->flac_data.data) {
  351. free (music->flac_data.data);
  352. }
  353. music->flac_data.data_len = music->flac_data.max_to_read;
  354. music->flac_data.data_read = 0;
  355. music->flac_data.data = (char *)malloc (music->flac_data.data_len);
  356. // we have data to read
  357. while(music->flac_data.max_to_read > 0) {
  358. // first check if there is data in the overflow from before
  359. if (music->flac_data.overflow) {
  360. size_t overflow_len = music->flac_data.overflow_read;
  361. if (overflow_len > music->flac_data.max_to_read) {
  362. size_t overflow_extra_len = overflow_len -
  363. music->flac_data.max_to_read;
  364. char* new_overflow = (char *)malloc (overflow_extra_len);
  365. memcpy (music->flac_data.data+music->flac_data.data_read,
  366. music->flac_data.overflow, music->flac_data.max_to_read);
  367. music->flac_data.data_read += music->flac_data.max_to_read;
  368. memcpy (new_overflow,
  369. music->flac_data.overflow + music->flac_data.max_to_read,
  370. overflow_extra_len);
  371. free (music->flac_data.overflow);
  372. music->flac_data.overflow = new_overflow;
  373. music->flac_data.overflow_len = overflow_extra_len;
  374. music->flac_data.overflow_read = 0;
  375. music->flac_data.max_to_read = 0;
  376. }
  377. else {
  378. memcpy (music->flac_data.data+music->flac_data.data_read,
  379. music->flac_data.overflow, overflow_len);
  380. music->flac_data.data_read += overflow_len;
  381. free (music->flac_data.overflow);
  382. music->flac_data.overflow = NULL;
  383. music->flac_data.overflow_len = 0;
  384. music->flac_data.overflow_read = 0;
  385. music->flac_data.max_to_read -= overflow_len;
  386. }
  387. }
  388. else {
  389. if (!flac.FLAC__stream_decoder_process_single (
  390. music->flac_decoder)) {
  391. music->flac_data.max_to_read = 0;
  392. }
  393. if (flac.FLAC__stream_decoder_get_state (music->flac_decoder)
  394. == FLAC__STREAM_DECODER_END_OF_STREAM) {
  395. music->flac_data.max_to_read = 0;
  396. }
  397. }
  398. }
  399. if (music->flac_data.data_read <= 0) {
  400. if (music->flac_data.data_read == 0) {
  401. music->playing = 0;
  402. }
  403. return;
  404. }
  405. cvt = &music->cvt;
  406. if (section != music->section) {
  407. SDL_BuildAudioCVT (cvt, AUDIO_S16, (Uint8)music->flac_data.channels,
  408. (int)music->flac_data.sample_rate, mixer.format,
  409.                 mixer.channels, mixer.freq);
  410. if (cvt->buf) {
  411. free (cvt->buf);
  412. }
  413. cvt->buf = (Uint8 *)malloc (music->flac_data.data_len * cvt->len_mult);
  414. music->section = section;
  415. }
  416. if (cvt->buf) {
  417. memcpy (cvt->buf, music->flac_data.data, music->flac_data.data_read);
  418. if (cvt->needed) {
  419. cvt->len = music->flac_data.data_read;
  420. SDL_ConvertAudio (cvt);
  421. }
  422. else {
  423. cvt->len_cvt = music->flac_data.data_read;
  424. }
  425. music->len_available = music->cvt.len_cvt;
  426. music->snd_available = music->cvt.buf;
  427. }
  428. else {
  429. SDL_SetError ("Out of memory");
  430. music->playing = 0;
  431. }
  432. }
  433. /* Play some of a stream previously started with FLAC_play() */
  434. int FLAC_playAudio(FLAC_music *music, Uint8 *snd, int len)
  435. {
  436. int mixable;
  437. while ((len > 0) && music->playing) {
  438. if (!music->len_available) {
  439. FLAC_getsome (music);
  440. }
  441. mixable = len;
  442. if (mixable > music->len_available) {
  443. mixable = music->len_available;
  444. }
  445. if (music->volume == MIX_MAX_VOLUME) {
  446. memcpy (snd, music->snd_available, mixable);
  447. }
  448. else {
  449. SDL_MixAudio (snd, music->snd_available, mixable, music->volume);
  450. }
  451. music->len_available -= mixable;
  452. music->snd_available += mixable;
  453. len -= mixable;
  454. snd += mixable;
  455. }
  456. return len;
  457. }
  458. /* Stop playback of a stream previously started with FLAC_play() */
  459. void FLAC_stop(FLAC_music *music)
  460. {
  461. music->playing = 0;
  462. }
  463. /* Close the given FLAC_music object */
  464. void FLAC_delete(FLAC_music *music)
  465. {
  466. if (music) {
  467. if (music->flac_decoder) {
  468. flac.FLAC__stream_decoder_finish (music->flac_decoder);
  469. flac.FLAC__stream_decoder_delete (music->flac_decoder);
  470. }
  471. if (music->flac_data.data) {
  472. free (music->flac_data.data);
  473. }
  474. if (music->flac_data.overflow) {
  475. free (music->flac_data.overflow);
  476. }
  477. if (music->cvt.buf) {
  478. free (music->cvt.buf);
  479. }
  480. free (music);
  481. }
  482. }
  483. /* Jump (seek) to a given position (time is in seconds) */
  484. void FLAC_jump_to_time(FLAC_music *music, double time)
  485. {
  486. if (music) {
  487. if (music->flac_decoder) {
  488. double seek_sample = music->flac_data.sample_rate * time;
  489. // clear data if it has data
  490. if (music->flac_data.data) {
  491. free (music->flac_data.data);
  492. music->flac_data.data = NULL;
  493. }
  494. // clear overflow if it has data
  495. if (music->flac_data.overflow) {
  496. free (music->flac_data.overflow);
  497. music->flac_data.overflow = NULL;
  498. }
  499. if (!flac.FLAC__stream_decoder_seek_absolute (music->flac_decoder,
  500. (FLAC__uint64)seek_sample)) {
  501. if (flac.FLAC__stream_decoder_get_state (music->flac_decoder)
  502. == FLAC__STREAM_DECODER_SEEK_ERROR) {
  503. flac.FLAC__stream_decoder_flush (music->flac_decoder);
  504. }
  505. SDL_SetError
  506. ("Seeking of FLAC stream failed: libFLAC seek failed.");
  507. }
  508. }
  509. else {
  510. SDL_SetError
  511. ("Seeking of FLAC stream failed: FLAC decoder was NULL.");
  512. }
  513. }
  514. else {
  515. SDL_SetError ("Seeking of FLAC stream failed: music was NULL.");
  516. }
  517. }
  518. #endif /* FLAC_MUSIC */