stream_encoder.c
上传用户:wstnjxml
上传日期:2014-04-03
资源大小:7248k
文件大小:28k
源码类别:

Windows CE

开发平台:

C/C++

  1. /* libOggFLAC - Free Lossless Audio Codec + Ogg library
  2.  * Copyright (C) 2002,2003,2004,2005  Josh Coalson
  3.  *
  4.  * Redistribution and use in source and binary forms, with or without
  5.  * modification, are permitted provided that the following conditions
  6.  * are met:
  7.  *
  8.  * - Redistributions of source code must retain the above copyright
  9.  * notice, this list of conditions and the following disclaimer.
  10.  *
  11.  * - Redistributions in binary form must reproduce the above copyright
  12.  * notice, this list of conditions and the following disclaimer in the
  13.  * documentation and/or other materials provided with the distribution.
  14.  *
  15.  * - Neither the name of the Xiph.org Foundation nor the names of its
  16.  * contributors may be used to endorse or promote products derived from
  17.  * this software without specific prior written permission.
  18.  *
  19.  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
  20.  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
  21.  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
  22.  * A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR
  23.  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
  24.  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
  25.  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
  26.  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
  27.  * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
  28.  * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
  29.  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  30.  */
  31. #include <stdio.h>
  32. #include <stdlib.h> /* for calloc() */
  33. #include "FLAC/assert.h"
  34. #include "OggFLAC/stream_encoder.h"
  35. #include "protected/stream_encoder.h"
  36. /***********************************************************************
  37.  *
  38.  * Private class method prototypes
  39.  *
  40.  ***********************************************************************/
  41. /* unpublished debug routines */
  42. extern FLAC__bool FLAC__stream_encoder_disable_constant_subframes(FLAC__StreamEncoder *encoder, FLAC__bool value);
  43. extern FLAC__bool FLAC__stream_encoder_disable_fixed_subframes(FLAC__StreamEncoder *encoder, FLAC__bool value);
  44. extern FLAC__bool FLAC__stream_encoder_disable_verbatim_subframes(FLAC__StreamEncoder *encoder, FLAC__bool value);
  45. static void set_defaults_(OggFLAC__StreamEncoder *encoder);
  46. static FLAC__StreamEncoderWriteStatus write_callback_(const FLAC__StreamEncoder *encoder, const FLAC__byte buffer[], unsigned bytes, unsigned samples, unsigned current_frame, void *client_data);
  47. static void metadata_callback_(const FLAC__StreamEncoder *encoder, const FLAC__StreamMetadata *metadata, void *client_data);
  48. /***********************************************************************
  49.  *
  50.  * Private class data
  51.  *
  52.  ***********************************************************************/
  53. typedef struct OggFLAC__StreamEncoderPrivate {
  54. OggFLAC__StreamEncoderWriteCallback write_callback;
  55. OggFLAC__StreamEncoderMetadataCallback metadata_callback;
  56. void *client_data;
  57. FLAC__StreamEncoder *FLAC_stream_encoder;
  58. } OggFLAC__StreamEncoderPrivate;
  59. /***********************************************************************
  60.  *
  61.  * Public static class data
  62.  *
  63.  ***********************************************************************/
  64. OggFLAC_API const char * const OggFLAC__StreamEncoderStateString[] = {
  65. "OggFLAC__STREAM_ENCODER_OK",
  66. "OggFLAC__STREAM_ENCODER_OGG_ERROR",
  67. "OggFLAC__STREAM_ENCODER_FLAC_STREAM_ENCODER_ERROR",
  68. "OggFLAC__STREAM_ENCODER_INVALID_CALLBACK",
  69. "OggFLAC__STREAM_ENCODER_MEMORY_ALLOCATION_ERROR",
  70. "OggFLAC__STREAM_ENCODER_ALREADY_INITIALIZED",
  71. "OggFLAC__STREAM_ENCODER_UNINITIALIZED"
  72. };
  73. /***********************************************************************
  74.  *
  75.  * Class constructor/destructor
  76.  *
  77.  */
  78. OggFLAC_API OggFLAC__StreamEncoder *OggFLAC__stream_encoder_new()
  79. {
  80. OggFLAC__StreamEncoder *encoder;
  81. encoder = (OggFLAC__StreamEncoder*)calloc(1, sizeof(OggFLAC__StreamEncoder));
  82. if(encoder == 0) {
  83. return 0;
  84. }
  85. encoder->protected_ = (OggFLAC__StreamEncoderProtected*)calloc(1, sizeof(OggFLAC__StreamEncoderProtected));
  86. if(encoder->protected_ == 0) {
  87. free(encoder);
  88. return 0;
  89. }
  90. encoder->private_ = (OggFLAC__StreamEncoderPrivate*)calloc(1, sizeof(OggFLAC__StreamEncoderPrivate));
  91. if(encoder->private_ == 0) {
  92. free(encoder->protected_);
  93. free(encoder);
  94. return 0;
  95. }
  96. encoder->private_->FLAC_stream_encoder = FLAC__stream_encoder_new();
  97. if(0 == encoder->private_->FLAC_stream_encoder) {
  98. free(encoder->private_);
  99. free(encoder->protected_);
  100. free(encoder);
  101. return 0;
  102. }
  103. set_defaults_(encoder);
  104. encoder->protected_->state = OggFLAC__STREAM_ENCODER_UNINITIALIZED;
  105. return encoder;
  106. }
  107. OggFLAC_API void OggFLAC__stream_encoder_delete(OggFLAC__StreamEncoder *encoder)
  108. {
  109. FLAC__ASSERT(0 != encoder);
  110. FLAC__ASSERT(0 != encoder->protected_);
  111. FLAC__ASSERT(0 != encoder->private_);
  112. FLAC__ASSERT(0 != encoder->private_->FLAC_stream_encoder);
  113. (void)OggFLAC__stream_encoder_finish(encoder);
  114. FLAC__stream_encoder_delete(encoder->private_->FLAC_stream_encoder);
  115. free(encoder->private_);
  116. free(encoder->protected_);
  117. free(encoder);
  118. }
  119. /***********************************************************************
  120.  *
  121.  * Public class methods
  122.  *
  123.  ***********************************************************************/
  124. OggFLAC_API OggFLAC__StreamEncoderState OggFLAC__stream_encoder_init(OggFLAC__StreamEncoder *encoder)
  125. {
  126. FLAC__ASSERT(0 != encoder);
  127. if(encoder->protected_->state != OggFLAC__STREAM_ENCODER_UNINITIALIZED)
  128. return encoder->protected_->state = OggFLAC__STREAM_ENCODER_ALREADY_INITIALIZED;
  129. if(0 == encoder->private_->write_callback || 0 == encoder->private_->metadata_callback)
  130. return encoder->protected_->state = OggFLAC__STREAM_ENCODER_INVALID_CALLBACK;
  131. if(!OggFLAC__ogg_encoder_aspect_init(&encoder->protected_->ogg_encoder_aspect))
  132. return encoder->protected_->state = OggFLAC__STREAM_ENCODER_OGG_ERROR;
  133. FLAC__stream_encoder_set_write_callback(encoder->private_->FLAC_stream_encoder, write_callback_);
  134. FLAC__stream_encoder_set_metadata_callback(encoder->private_->FLAC_stream_encoder, metadata_callback_);
  135. FLAC__stream_encoder_set_client_data(encoder->private_->FLAC_stream_encoder, encoder);
  136. if(FLAC__stream_encoder_init(encoder->private_->FLAC_stream_encoder) != FLAC__STREAM_ENCODER_OK)
  137. return encoder->protected_->state = OggFLAC__STREAM_ENCODER_FLAC_STREAM_ENCODER_ERROR;
  138. return encoder->protected_->state = OggFLAC__STREAM_ENCODER_OK;
  139. }
  140. OggFLAC_API void OggFLAC__stream_encoder_finish(OggFLAC__StreamEncoder *encoder)
  141. {
  142. FLAC__ASSERT(0 != encoder);
  143. FLAC__ASSERT(0 != encoder->private_);
  144. FLAC__ASSERT(0 != encoder->protected_);
  145. if(encoder->protected_->state == OggFLAC__STREAM_ENCODER_UNINITIALIZED)
  146. return;
  147. FLAC__ASSERT(0 != encoder->private_->FLAC_stream_encoder);
  148. FLAC__stream_encoder_finish(encoder->private_->FLAC_stream_encoder);
  149. OggFLAC__ogg_encoder_aspect_finish(&encoder->protected_->ogg_encoder_aspect);
  150. set_defaults_(encoder);
  151. encoder->protected_->state = OggFLAC__STREAM_ENCODER_UNINITIALIZED;
  152. }
  153. OggFLAC_API FLAC__bool OggFLAC__stream_encoder_set_serial_number(OggFLAC__StreamEncoder *encoder, long value)
  154. {
  155. FLAC__ASSERT(0 != encoder);
  156. FLAC__ASSERT(0 != encoder->private_);
  157. FLAC__ASSERT(0 != encoder->protected_);
  158. FLAC__ASSERT(0 != encoder->private_->FLAC_stream_encoder);
  159. if(encoder->protected_->state != OggFLAC__STREAM_ENCODER_UNINITIALIZED)
  160. return false;
  161. OggFLAC__ogg_encoder_aspect_set_serial_number(&encoder->protected_->ogg_encoder_aspect, value);
  162. return true;
  163. }
  164. OggFLAC_API FLAC__bool OggFLAC__stream_encoder_set_verify(OggFLAC__StreamEncoder *encoder, FLAC__bool value)
  165. {
  166. FLAC__ASSERT(0 != encoder);
  167. FLAC__ASSERT(0 != encoder->private_);
  168. FLAC__ASSERT(0 != encoder->protected_);
  169. FLAC__ASSERT(0 != encoder->private_->FLAC_stream_encoder);
  170. if(encoder->protected_->state != OggFLAC__STREAM_ENCODER_UNINITIALIZED)
  171. return false;
  172. return FLAC__stream_encoder_set_verify(encoder->private_->FLAC_stream_encoder, value);
  173. }
  174. OggFLAC_API FLAC__bool OggFLAC__stream_encoder_set_streamable_subset(OggFLAC__StreamEncoder *encoder, FLAC__bool value)
  175. {
  176. FLAC__ASSERT(0 != encoder);
  177. FLAC__ASSERT(0 != encoder->private_);
  178. FLAC__ASSERT(0 != encoder->protected_);
  179. FLAC__ASSERT(0 != encoder->private_->FLAC_stream_encoder);
  180. if(encoder->protected_->state != OggFLAC__STREAM_ENCODER_UNINITIALIZED)
  181. return false;
  182. return FLAC__stream_encoder_set_streamable_subset(encoder->private_->FLAC_stream_encoder, value);
  183. }
  184. OggFLAC_API FLAC__bool OggFLAC__stream_encoder_set_do_mid_side_stereo(OggFLAC__StreamEncoder *encoder, FLAC__bool value)
  185. {
  186. FLAC__ASSERT(0 != encoder);
  187. FLAC__ASSERT(0 != encoder->private_);
  188. FLAC__ASSERT(0 != encoder->protected_);
  189. FLAC__ASSERT(0 != encoder->private_->FLAC_stream_encoder);
  190. if(encoder->protected_->state != OggFLAC__STREAM_ENCODER_UNINITIALIZED)
  191. return false;
  192. return FLAC__stream_encoder_set_do_mid_side_stereo(encoder->private_->FLAC_stream_encoder, value);
  193. }
  194. OggFLAC_API FLAC__bool OggFLAC__stream_encoder_set_loose_mid_side_stereo(OggFLAC__StreamEncoder *encoder, FLAC__bool value)
  195. {
  196. FLAC__ASSERT(0 != encoder);
  197. FLAC__ASSERT(0 != encoder->private_);
  198. FLAC__ASSERT(0 != encoder->protected_);
  199. FLAC__ASSERT(0 != encoder->private_->FLAC_stream_encoder);
  200. if(encoder->protected_->state != OggFLAC__STREAM_ENCODER_UNINITIALIZED)
  201. return false;
  202. return FLAC__stream_encoder_set_loose_mid_side_stereo(encoder->private_->FLAC_stream_encoder, value);
  203. }
  204. OggFLAC_API FLAC__bool OggFLAC__stream_encoder_set_channels(OggFLAC__StreamEncoder *encoder, unsigned value)
  205. {
  206. FLAC__ASSERT(0 != encoder);
  207. FLAC__ASSERT(0 != encoder->private_);
  208. FLAC__ASSERT(0 != encoder->protected_);
  209. FLAC__ASSERT(0 != encoder->private_->FLAC_stream_encoder);
  210. if(encoder->protected_->state != OggFLAC__STREAM_ENCODER_UNINITIALIZED)
  211. return false;
  212. return FLAC__stream_encoder_set_channels(encoder->private_->FLAC_stream_encoder, value);
  213. }
  214. OggFLAC_API FLAC__bool OggFLAC__stream_encoder_set_bits_per_sample(OggFLAC__StreamEncoder *encoder, unsigned value)
  215. {
  216. FLAC__ASSERT(0 != encoder);
  217. FLAC__ASSERT(0 != encoder->private_);
  218. FLAC__ASSERT(0 != encoder->protected_);
  219. FLAC__ASSERT(0 != encoder->private_->FLAC_stream_encoder);
  220. if(encoder->protected_->state != OggFLAC__STREAM_ENCODER_UNINITIALIZED)
  221. return false;
  222. return FLAC__stream_encoder_set_bits_per_sample(encoder->private_->FLAC_stream_encoder, value);
  223. }
  224. OggFLAC_API FLAC__bool OggFLAC__stream_encoder_set_sample_rate(OggFLAC__StreamEncoder *encoder, unsigned value)
  225. {
  226. FLAC__ASSERT(0 != encoder);
  227. FLAC__ASSERT(0 != encoder->private_);
  228. FLAC__ASSERT(0 != encoder->protected_);
  229. FLAC__ASSERT(0 != encoder->private_->FLAC_stream_encoder);
  230. if(encoder->protected_->state != OggFLAC__STREAM_ENCODER_UNINITIALIZED)
  231. return false;
  232. return FLAC__stream_encoder_set_sample_rate(encoder->private_->FLAC_stream_encoder, value);
  233. }
  234. OggFLAC_API FLAC__bool OggFLAC__stream_encoder_set_blocksize(OggFLAC__StreamEncoder *encoder, unsigned value)
  235. {
  236. FLAC__ASSERT(0 != encoder);
  237. FLAC__ASSERT(0 != encoder->private_);
  238. FLAC__ASSERT(0 != encoder->protected_);
  239. FLAC__ASSERT(0 != encoder->private_->FLAC_stream_encoder);
  240. if(encoder->protected_->state != OggFLAC__STREAM_ENCODER_UNINITIALIZED)
  241. return false;
  242. return FLAC__stream_encoder_set_blocksize(encoder->private_->FLAC_stream_encoder, value);
  243. }
  244. OggFLAC_API FLAC__bool OggFLAC__stream_encoder_set_max_lpc_order(OggFLAC__StreamEncoder *encoder, unsigned value)
  245. {
  246. FLAC__ASSERT(0 != encoder);
  247. FLAC__ASSERT(0 != encoder->private_);
  248. FLAC__ASSERT(0 != encoder->protected_);
  249. FLAC__ASSERT(0 != encoder->private_->FLAC_stream_encoder);
  250. if(encoder->protected_->state != OggFLAC__STREAM_ENCODER_UNINITIALIZED)
  251. return false;
  252. return FLAC__stream_encoder_set_max_lpc_order(encoder->private_->FLAC_stream_encoder, value);
  253. }
  254. OggFLAC_API FLAC__bool OggFLAC__stream_encoder_set_qlp_coeff_precision(OggFLAC__StreamEncoder *encoder, unsigned value)
  255. {
  256. FLAC__ASSERT(0 != encoder);
  257. FLAC__ASSERT(0 != encoder->private_);
  258. FLAC__ASSERT(0 != encoder->protected_);
  259. FLAC__ASSERT(0 != encoder->private_->FLAC_stream_encoder);
  260. if(encoder->protected_->state != OggFLAC__STREAM_ENCODER_UNINITIALIZED)
  261. return false;
  262. return FLAC__stream_encoder_set_qlp_coeff_precision(encoder->private_->FLAC_stream_encoder, value);
  263. }
  264. OggFLAC_API FLAC__bool OggFLAC__stream_encoder_set_do_qlp_coeff_prec_search(OggFLAC__StreamEncoder *encoder, FLAC__bool value)
  265. {
  266. FLAC__ASSERT(0 != encoder);
  267. FLAC__ASSERT(0 != encoder->private_);
  268. FLAC__ASSERT(0 != encoder->protected_);
  269. FLAC__ASSERT(0 != encoder->private_->FLAC_stream_encoder);
  270. if(encoder->protected_->state != OggFLAC__STREAM_ENCODER_UNINITIALIZED)
  271. return false;
  272. return FLAC__stream_encoder_set_do_qlp_coeff_prec_search(encoder->private_->FLAC_stream_encoder, value);
  273. }
  274. OggFLAC_API FLAC__bool OggFLAC__stream_encoder_set_do_escape_coding(OggFLAC__StreamEncoder *encoder, FLAC__bool value)
  275. {
  276. FLAC__ASSERT(0 != encoder);
  277. FLAC__ASSERT(0 != encoder->private_);
  278. FLAC__ASSERT(0 != encoder->protected_);
  279. FLAC__ASSERT(0 != encoder->private_->FLAC_stream_encoder);
  280. if(encoder->protected_->state != OggFLAC__STREAM_ENCODER_UNINITIALIZED)
  281. return false;
  282. return FLAC__stream_encoder_set_do_escape_coding(encoder->private_->FLAC_stream_encoder, value);
  283. }
  284. OggFLAC_API FLAC__bool OggFLAC__stream_encoder_set_do_exhaustive_model_search(OggFLAC__StreamEncoder *encoder, FLAC__bool value)
  285. {
  286. FLAC__ASSERT(0 != encoder);
  287. FLAC__ASSERT(0 != encoder->private_);
  288. FLAC__ASSERT(0 != encoder->protected_);
  289. FLAC__ASSERT(0 != encoder->private_->FLAC_stream_encoder);
  290. if(encoder->protected_->state != OggFLAC__STREAM_ENCODER_UNINITIALIZED)
  291. return false;
  292. return FLAC__stream_encoder_set_do_exhaustive_model_search(encoder->private_->FLAC_stream_encoder, value);
  293. }
  294. OggFLAC_API FLAC__bool OggFLAC__stream_encoder_set_min_residual_partition_order(OggFLAC__StreamEncoder *encoder, unsigned value)
  295. {
  296. FLAC__ASSERT(0 != encoder);
  297. FLAC__ASSERT(0 != encoder->private_);
  298. FLAC__ASSERT(0 != encoder->protected_);
  299. FLAC__ASSERT(0 != encoder->private_->FLAC_stream_encoder);
  300. if(encoder->protected_->state != OggFLAC__STREAM_ENCODER_UNINITIALIZED)
  301. return false;
  302. return FLAC__stream_encoder_set_min_residual_partition_order(encoder->private_->FLAC_stream_encoder, value);
  303. }
  304. OggFLAC_API FLAC__bool OggFLAC__stream_encoder_set_max_residual_partition_order(OggFLAC__StreamEncoder *encoder, unsigned value)
  305. {
  306. FLAC__ASSERT(0 != encoder);
  307. FLAC__ASSERT(0 != encoder->private_);
  308. FLAC__ASSERT(0 != encoder->protected_);
  309. FLAC__ASSERT(0 != encoder->private_->FLAC_stream_encoder);
  310. if(encoder->protected_->state != OggFLAC__STREAM_ENCODER_UNINITIALIZED)
  311. return false;
  312. return FLAC__stream_encoder_set_max_residual_partition_order(encoder->private_->FLAC_stream_encoder, value);
  313. }
  314. OggFLAC_API FLAC__bool OggFLAC__stream_encoder_set_rice_parameter_search_dist(OggFLAC__StreamEncoder *encoder, unsigned value)
  315. {
  316. FLAC__ASSERT(0 != encoder);
  317. FLAC__ASSERT(0 != encoder->private_);
  318. FLAC__ASSERT(0 != encoder->protected_);
  319. FLAC__ASSERT(0 != encoder->private_->FLAC_stream_encoder);
  320. if(encoder->protected_->state != OggFLAC__STREAM_ENCODER_UNINITIALIZED)
  321. return false;
  322. return FLAC__stream_encoder_set_rice_parameter_search_dist(encoder->private_->FLAC_stream_encoder, value);
  323. }
  324. OggFLAC_API FLAC__bool OggFLAC__stream_encoder_set_total_samples_estimate(OggFLAC__StreamEncoder *encoder, FLAC__uint64 value)
  325. {
  326. FLAC__ASSERT(0 != encoder);
  327. FLAC__ASSERT(0 != encoder->private_);
  328. FLAC__ASSERT(0 != encoder->protected_);
  329. FLAC__ASSERT(0 != encoder->private_->FLAC_stream_encoder);
  330. if(encoder->protected_->state != OggFLAC__STREAM_ENCODER_UNINITIALIZED)
  331. return false;
  332. return FLAC__stream_encoder_set_total_samples_estimate(encoder->private_->FLAC_stream_encoder, value);
  333. }
  334. OggFLAC_API FLAC__bool OggFLAC__stream_encoder_set_metadata(OggFLAC__StreamEncoder *encoder, FLAC__StreamMetadata **metadata, unsigned num_blocks)
  335. {
  336. FLAC__ASSERT(0 != encoder);
  337. FLAC__ASSERT(0 != encoder->private_);
  338. FLAC__ASSERT(0 != encoder->protected_);
  339. FLAC__ASSERT(0 != encoder->private_->FLAC_stream_encoder);
  340. if(encoder->protected_->state != OggFLAC__STREAM_ENCODER_UNINITIALIZED)
  341. return false;
  342. /* reorder metadata if necessary to ensure that any VORBIS_COMMENT is the first, according to the mapping spec */
  343. if(0 != metadata && num_blocks > 1) {
  344. unsigned i;
  345. for(i = 1; i < num_blocks; i++) {
  346. if(0 != metadata[i] && metadata[i]->type == FLAC__METADATA_TYPE_VORBIS_COMMENT) {
  347. FLAC__StreamMetadata *vc = metadata[i];
  348. for( ; i > 0; i--)
  349. metadata[i] = metadata[i-1];
  350. metadata[0] = vc;
  351. break;
  352. }
  353. }
  354. }
  355. if(!OggFLAC__ogg_encoder_aspect_set_num_metadata(&encoder->protected_->ogg_encoder_aspect, num_blocks))
  356. return false;
  357. return FLAC__stream_encoder_set_metadata(encoder->private_->FLAC_stream_encoder, metadata, num_blocks);
  358. }
  359. OggFLAC_API FLAC__bool OggFLAC__stream_encoder_set_write_callback(OggFLAC__StreamEncoder *encoder, OggFLAC__StreamEncoderWriteCallback value)
  360. {
  361. FLAC__ASSERT(0 != encoder);
  362. FLAC__ASSERT(0 != encoder->private_);
  363. FLAC__ASSERT(0 != encoder->protected_);
  364. FLAC__ASSERT(0 != value);
  365. if(encoder->protected_->state != OggFLAC__STREAM_ENCODER_UNINITIALIZED)
  366. return false;
  367. encoder->private_->write_callback = value;
  368. return true;
  369. }
  370. OggFLAC_API FLAC__bool OggFLAC__stream_encoder_set_metadata_callback(OggFLAC__StreamEncoder *encoder, OggFLAC__StreamEncoderMetadataCallback value)
  371. {
  372. FLAC__ASSERT(0 != encoder);
  373. FLAC__ASSERT(0 != encoder->private_);
  374. FLAC__ASSERT(0 != encoder->protected_);
  375. FLAC__ASSERT(0 != value);
  376. if(encoder->protected_->state != OggFLAC__STREAM_ENCODER_UNINITIALIZED)
  377. return false;
  378. encoder->private_->metadata_callback = value;
  379. return true;
  380. }
  381. OggFLAC_API FLAC__bool OggFLAC__stream_encoder_set_client_data(OggFLAC__StreamEncoder *encoder, void *value)
  382. {
  383. FLAC__ASSERT(0 != encoder);
  384. FLAC__ASSERT(0 != encoder->private_);
  385. FLAC__ASSERT(0 != encoder->protected_);
  386. if(encoder->protected_->state != OggFLAC__STREAM_ENCODER_UNINITIALIZED)
  387. return false;
  388. encoder->private_->client_data = value;
  389. return true;
  390. }
  391. /*
  392.  * These three functions are not static, but not publically exposed in
  393.  * include/FLAC/ either.  They are used by the test suite.
  394.  */
  395. OggFLAC_API FLAC__bool OggFLAC__stream_encoder_disable_constant_subframes(OggFLAC__StreamEncoder *encoder, FLAC__bool value)
  396. {
  397. FLAC__ASSERT(0 != encoder);
  398. FLAC__ASSERT(0 != encoder->private_);
  399. FLAC__ASSERT(0 != encoder->protected_);
  400. if(encoder->protected_->state != OggFLAC__STREAM_ENCODER_UNINITIALIZED)
  401. return false;
  402. return FLAC__stream_encoder_disable_constant_subframes(encoder->private_->FLAC_stream_encoder, value);
  403. }
  404. OggFLAC_API FLAC__bool OggFLAC__stream_encoder_disable_fixed_subframes(OggFLAC__StreamEncoder *encoder, FLAC__bool value)
  405. {
  406. FLAC__ASSERT(0 != encoder);
  407. FLAC__ASSERT(0 != encoder->private_);
  408. FLAC__ASSERT(0 != encoder->protected_);
  409. if(encoder->protected_->state != OggFLAC__STREAM_ENCODER_UNINITIALIZED)
  410. return false;
  411. return FLAC__stream_encoder_disable_fixed_subframes(encoder->private_->FLAC_stream_encoder, value);
  412. }
  413. OggFLAC_API FLAC__bool OggFLAC__stream_encoder_disable_verbatim_subframes(OggFLAC__StreamEncoder *encoder, FLAC__bool value)
  414. {
  415. FLAC__ASSERT(0 != encoder);
  416. FLAC__ASSERT(0 != encoder->private_);
  417. FLAC__ASSERT(0 != encoder->protected_);
  418. if(encoder->protected_->state != OggFLAC__STREAM_ENCODER_UNINITIALIZED)
  419. return false;
  420. return FLAC__stream_encoder_disable_verbatim_subframes(encoder->private_->FLAC_stream_encoder, value);
  421. }
  422. OggFLAC_API OggFLAC__StreamEncoderState OggFLAC__stream_encoder_get_state(const OggFLAC__StreamEncoder *encoder)
  423. {
  424. FLAC__ASSERT(0 != encoder);
  425. FLAC__ASSERT(0 != encoder->private_);
  426. FLAC__ASSERT(0 != encoder->protected_);
  427. return encoder->protected_->state;
  428. }
  429. OggFLAC_API FLAC__StreamEncoderState OggFLAC__stream_encoder_get_FLAC_stream_encoder_state(const OggFLAC__StreamEncoder *encoder)
  430. {
  431. FLAC__ASSERT(0 != encoder);
  432. FLAC__ASSERT(0 != encoder->private_);
  433. FLAC__ASSERT(0 != encoder->protected_);
  434. return FLAC__stream_encoder_get_state(encoder->private_->FLAC_stream_encoder);
  435. }
  436. OggFLAC_API FLAC__StreamDecoderState OggFLAC__stream_encoder_get_verify_decoder_state(const OggFLAC__StreamEncoder *encoder)
  437. {
  438. FLAC__ASSERT(0 != encoder);
  439. FLAC__ASSERT(0 != encoder->private_);
  440. FLAC__ASSERT(0 != encoder->protected_);
  441. return FLAC__stream_encoder_get_verify_decoder_state(encoder->private_->FLAC_stream_encoder);
  442. }
  443. OggFLAC_API const char *OggFLAC__stream_encoder_get_resolved_state_string(const OggFLAC__StreamEncoder *encoder)
  444. {
  445. if(encoder->protected_->state != OggFLAC__STREAM_ENCODER_FLAC_STREAM_ENCODER_ERROR)
  446. return OggFLAC__StreamEncoderStateString[encoder->protected_->state];
  447. else
  448. return FLAC__stream_encoder_get_resolved_state_string(encoder->private_->FLAC_stream_encoder);
  449. }
  450. OggFLAC_API void OggFLAC__stream_encoder_get_verify_decoder_error_stats(const OggFLAC__StreamEncoder *encoder, FLAC__uint64 *absolute_sample, unsigned *frame_number, unsigned *channel, unsigned *sample, FLAC__int32 *expected, FLAC__int32 *got)
  451. {
  452. FLAC__ASSERT(0 != encoder);
  453. FLAC__ASSERT(0 != encoder->private_);
  454. FLAC__stream_encoder_get_verify_decoder_error_stats(encoder->private_->FLAC_stream_encoder, absolute_sample, frame_number, channel, sample, expected, got);
  455. }
  456. OggFLAC_API FLAC__bool OggFLAC__stream_encoder_get_verify(const OggFLAC__StreamEncoder *encoder)
  457. {
  458. FLAC__ASSERT(0 != encoder);
  459. FLAC__ASSERT(0 != encoder->private_);
  460. FLAC__ASSERT(0 != encoder->protected_);
  461. return FLAC__stream_encoder_get_verify(encoder->private_->FLAC_stream_encoder);
  462. }
  463. OggFLAC_API FLAC__bool OggFLAC__stream_encoder_get_streamable_subset(const OggFLAC__StreamEncoder *encoder)
  464. {
  465. FLAC__ASSERT(0 != encoder);
  466. FLAC__ASSERT(0 != encoder->private_);
  467. FLAC__ASSERT(0 != encoder->protected_);
  468. return FLAC__stream_encoder_get_streamable_subset(encoder->private_->FLAC_stream_encoder);
  469. }
  470. OggFLAC_API FLAC__bool OggFLAC__stream_encoder_get_do_mid_side_stereo(const OggFLAC__StreamEncoder *encoder)
  471. {
  472. FLAC__ASSERT(0 != encoder);
  473. FLAC__ASSERT(0 != encoder->private_);
  474. FLAC__ASSERT(0 != encoder->protected_);
  475. return FLAC__stream_encoder_get_do_mid_side_stereo(encoder->private_->FLAC_stream_encoder);
  476. }
  477. OggFLAC_API FLAC__bool OggFLAC__stream_encoder_get_loose_mid_side_stereo(const OggFLAC__StreamEncoder *encoder)
  478. {
  479. FLAC__ASSERT(0 != encoder);
  480. FLAC__ASSERT(0 != encoder->private_);
  481. FLAC__ASSERT(0 != encoder->protected_);
  482. return FLAC__stream_encoder_get_loose_mid_side_stereo(encoder->private_->FLAC_stream_encoder);
  483. }
  484. OggFLAC_API unsigned OggFLAC__stream_encoder_get_channels(const OggFLAC__StreamEncoder *encoder)
  485. {
  486. FLAC__ASSERT(0 != encoder);
  487. FLAC__ASSERT(0 != encoder->private_);
  488. FLAC__ASSERT(0 != encoder->protected_);
  489. return FLAC__stream_encoder_get_channels(encoder->private_->FLAC_stream_encoder);
  490. }
  491. OggFLAC_API unsigned OggFLAC__stream_encoder_get_bits_per_sample(const OggFLAC__StreamEncoder *encoder)
  492. {
  493. FLAC__ASSERT(0 != encoder);
  494. FLAC__ASSERT(0 != encoder->private_);
  495. FLAC__ASSERT(0 != encoder->protected_);
  496. return FLAC__stream_encoder_get_bits_per_sample(encoder->private_->FLAC_stream_encoder);
  497. }
  498. OggFLAC_API unsigned OggFLAC__stream_encoder_get_sample_rate(const OggFLAC__StreamEncoder *encoder)
  499. {
  500. FLAC__ASSERT(0 != encoder);
  501. FLAC__ASSERT(0 != encoder->private_);
  502. FLAC__ASSERT(0 != encoder->protected_);
  503. return FLAC__stream_encoder_get_sample_rate(encoder->private_->FLAC_stream_encoder);
  504. }
  505. OggFLAC_API unsigned OggFLAC__stream_encoder_get_blocksize(const OggFLAC__StreamEncoder *encoder)
  506. {
  507. FLAC__ASSERT(0 != encoder);
  508. FLAC__ASSERT(0 != encoder->private_);
  509. FLAC__ASSERT(0 != encoder->protected_);
  510. return FLAC__stream_encoder_get_blocksize(encoder->private_->FLAC_stream_encoder);
  511. }
  512. OggFLAC_API unsigned OggFLAC__stream_encoder_get_max_lpc_order(const OggFLAC__StreamEncoder *encoder)
  513. {
  514. FLAC__ASSERT(0 != encoder);
  515. FLAC__ASSERT(0 != encoder->private_);
  516. FLAC__ASSERT(0 != encoder->protected_);
  517. return FLAC__stream_encoder_get_max_lpc_order(encoder->private_->FLAC_stream_encoder);
  518. }
  519. OggFLAC_API unsigned OggFLAC__stream_encoder_get_qlp_coeff_precision(const OggFLAC__StreamEncoder *encoder)
  520. {
  521. FLAC__ASSERT(0 != encoder);
  522. FLAC__ASSERT(0 != encoder->private_);
  523. FLAC__ASSERT(0 != encoder->protected_);
  524. return FLAC__stream_encoder_get_qlp_coeff_precision(encoder->private_->FLAC_stream_encoder);
  525. }
  526. OggFLAC_API FLAC__bool OggFLAC__stream_encoder_get_do_qlp_coeff_prec_search(const OggFLAC__StreamEncoder *encoder)
  527. {
  528. FLAC__ASSERT(0 != encoder);
  529. FLAC__ASSERT(0 != encoder->private_);
  530. FLAC__ASSERT(0 != encoder->protected_);
  531. return FLAC__stream_encoder_get_do_qlp_coeff_prec_search(encoder->private_->FLAC_stream_encoder);
  532. }
  533. OggFLAC_API FLAC__bool OggFLAC__stream_encoder_get_do_escape_coding(const OggFLAC__StreamEncoder *encoder)
  534. {
  535. FLAC__ASSERT(0 != encoder);
  536. FLAC__ASSERT(0 != encoder->private_);
  537. FLAC__ASSERT(0 != encoder->protected_);
  538. return FLAC__stream_encoder_get_do_escape_coding(encoder->private_->FLAC_stream_encoder);
  539. }
  540. OggFLAC_API FLAC__bool OggFLAC__stream_encoder_get_do_exhaustive_model_search(const OggFLAC__StreamEncoder *encoder)
  541. {
  542. FLAC__ASSERT(0 != encoder);
  543. FLAC__ASSERT(0 != encoder->private_);
  544. FLAC__ASSERT(0 != encoder->protected_);
  545. return FLAC__stream_encoder_get_do_exhaustive_model_search(encoder->private_->FLAC_stream_encoder);
  546. }
  547. OggFLAC_API unsigned OggFLAC__stream_encoder_get_min_residual_partition_order(const OggFLAC__StreamEncoder *encoder)
  548. {
  549. FLAC__ASSERT(0 != encoder);
  550. FLAC__ASSERT(0 != encoder->private_);
  551. FLAC__ASSERT(0 != encoder->protected_);
  552. return FLAC__stream_encoder_get_min_residual_partition_order(encoder->private_->FLAC_stream_encoder);
  553. }
  554. OggFLAC_API unsigned OggFLAC__stream_encoder_get_max_residual_partition_order(const OggFLAC__StreamEncoder *encoder)
  555. {
  556. FLAC__ASSERT(0 != encoder);
  557. FLAC__ASSERT(0 != encoder->private_);
  558. FLAC__ASSERT(0 != encoder->protected_);
  559. return FLAC__stream_encoder_get_max_residual_partition_order(encoder->private_->FLAC_stream_encoder);
  560. }
  561. OggFLAC_API unsigned OggFLAC__stream_encoder_get_rice_parameter_search_dist(const OggFLAC__StreamEncoder *encoder)
  562. {
  563. FLAC__ASSERT(0 != encoder);
  564. FLAC__ASSERT(0 != encoder->private_);
  565. FLAC__ASSERT(0 != encoder->protected_);
  566. return FLAC__stream_encoder_get_rice_parameter_search_dist(encoder->private_->FLAC_stream_encoder);
  567. }
  568. OggFLAC_API FLAC__uint64 OggFLAC__stream_encoder_get_total_samples_estimate(const OggFLAC__StreamEncoder *encoder)
  569. {
  570. FLAC__ASSERT(0 != encoder);
  571. FLAC__ASSERT(0 != encoder->private_);
  572. FLAC__ASSERT(0 != encoder->protected_);
  573. return FLAC__stream_encoder_get_total_samples_estimate(encoder->private_->FLAC_stream_encoder);
  574. }
  575. OggFLAC_API FLAC__bool OggFLAC__stream_encoder_process(OggFLAC__StreamEncoder *encoder, const FLAC__int32 * const buffer[], unsigned samples)
  576. {
  577. FLAC__ASSERT(0 != encoder);
  578. FLAC__ASSERT(0 != encoder->private_);
  579. FLAC__ASSERT(0 != encoder->protected_);
  580. return FLAC__stream_encoder_process(encoder->private_->FLAC_stream_encoder, buffer, samples);
  581. }
  582. OggFLAC_API FLAC__bool OggFLAC__stream_encoder_process_interleaved(OggFLAC__StreamEncoder *encoder, const FLAC__int32 buffer[], unsigned samples)
  583. {
  584. FLAC__ASSERT(0 != encoder);
  585. FLAC__ASSERT(0 != encoder->private_);
  586. FLAC__ASSERT(0 != encoder->protected_);
  587. return FLAC__stream_encoder_process_interleaved(encoder->private_->FLAC_stream_encoder, buffer, samples);
  588. }
  589. /***********************************************************************
  590.  *
  591.  * Private class methods
  592.  *
  593.  ***********************************************************************/
  594. void set_defaults_(OggFLAC__StreamEncoder *encoder)
  595. {
  596. FLAC__ASSERT(0 != encoder);
  597. encoder->private_->write_callback = 0;
  598. encoder->private_->metadata_callback = 0;
  599. encoder->private_->client_data = 0;
  600. OggFLAC__ogg_encoder_aspect_set_defaults(&encoder->protected_->ogg_encoder_aspect);
  601. }
  602. FLAC__StreamEncoderWriteStatus write_callback_(const FLAC__StreamEncoder *unused, const FLAC__byte buffer[], unsigned bytes, unsigned samples, unsigned current_frame, void *client_data)
  603. {
  604. OggFLAC__StreamEncoder *encoder = (OggFLAC__StreamEncoder*)client_data;
  605. const FLAC__uint64 total_samples_estimate = FLAC__stream_encoder_get_total_samples_estimate(encoder->private_->FLAC_stream_encoder);
  606. (void)unused;
  607. FLAC__ASSERT(encoder->private_->FLAC_stream_encoder == unused);
  608. return OggFLAC__ogg_encoder_aspect_write_callback_wrapper(&encoder->protected_->ogg_encoder_aspect, total_samples_estimate, buffer, bytes, samples, current_frame, (OggFLAC__OggEncoderAspectWriteCallbackProxy)encoder->private_->write_callback, encoder, encoder->private_->client_data);
  609. }
  610. void metadata_callback_(const FLAC__StreamEncoder *unused, const FLAC__StreamMetadata *metadata, void *client_data)
  611. {
  612. OggFLAC__StreamEncoder *encoder = (OggFLAC__StreamEncoder*)client_data;
  613. (void)unused;
  614. FLAC__ASSERT(encoder->private_->FLAC_stream_encoder == unused);
  615. encoder->private_->metadata_callback(encoder, metadata, encoder->private_->client_data);
  616. }