testapp.c
上传用户:zhongxx05
上传日期:2007-06-06
资源大小:33641k
文件大小:7k
源码类别:

Symbian

开发平台:

C/C++

  1. /* ***** BEGIN LICENSE BLOCK ***** 
  2.  * Version: RCSL 1.0/RPSL 1.0 
  3.  *  
  4.  * Portions Copyright (c) 1995-2002 RealNetworks, Inc. All Rights Reserved. 
  5.  *      
  6.  * The contents of this file, and the files included with this file, are 
  7.  * subject to the current version of the RealNetworks Public Source License 
  8.  * Version 1.0 (the "RPSL") available at 
  9.  * http://www.helixcommunity.org/content/rpsl unless you have licensed 
  10.  * the file under the RealNetworks Community Source License Version 1.0 
  11.  * (the "RCSL") available at http://www.helixcommunity.org/content/rcsl, 
  12.  * in which case the RCSL will apply. You may also obtain the license terms 
  13.  * directly from RealNetworks.  You may not use this file except in 
  14.  * compliance with the RPSL or, if you have a valid RCSL with RealNetworks 
  15.  * applicable to this file, the RCSL.  Please see the applicable RPSL or 
  16.  * RCSL for the rights, obligations and limitations governing use of the 
  17.  * contents of the file.  
  18.  *  
  19.  * This file is part of the Helix DNA Technology. RealNetworks is the 
  20.  * developer of the Original Code and owns the copyrights in the portions 
  21.  * it created. 
  22.  *  
  23.  * This file, and the files included with this file, is distributed and made 
  24.  * available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER 
  25.  * EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS ALL SUCH WARRANTIES, 
  26.  * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, FITNESS 
  27.  * FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. 
  28.  * 
  29.  * Technology Compatibility Kit Test Suite(s) Location: 
  30.  *    http://www.helixcommunity.org/content/tck 
  31.  * 
  32.  * Contributor(s): 
  33.  *  
  34.  * ***** END LICENSE BLOCK ***** */ 
  35. /*
  36.  * Fixed-point sampling rate conversion library
  37.  * Developed by Ken Cooke (kenc@real.com)
  38.  * May 2003
  39.  *
  40.  * Command-line test application.
  41.  */
  42. #include <stdio.h>
  43. #include <stdlib.h>
  44. #include <string.h>
  45. #include <time.h>
  46. #include <assert.h>
  47. #include "getopt.h"
  48. #include "../resample.h"
  49. #define ERROR(x) fprintf(stderr, "nError: %sn", x), exit(-1)
  50. #define WARNING(x) fprintf(stderr, "nWarning: %sn", x)
  51. #define ASSERT assert
  52. #define MAX(a,b) (((b) > (a)) ? (b) : (a))
  53. #define MIN(a,b) (((a) < (b)) ? (a) : (b))
  54. /* defaults */
  55. #define DEF_INRATE 44100
  56. #define DEF_OUTRATE 48000
  57. #define DEF_NCHUNK 4096
  58. #define DEF_QUALITY 1
  59. static int inrate = DEF_INRATE;
  60. static int outrate = DEF_OUTRATE;
  61. static int nchunk = DEF_NCHUNK;
  62. static int quality = DEF_QUALITY;
  63. static int chans = 1;
  64. static int outmode = 0;
  65. void
  66. Usage(char *name)
  67. {
  68. char *s;
  69. if (s = strrchr(name, '\')) /* basename */
  70. name = s + 1;
  71. printf("                                               n");
  72. printf("Usage: %s [options] infile outfile             n", name);
  73. printf("       -c           chunk output mode          n");
  74. printf("       -i INRATE    input samprate    (def=%d) n", DEF_INRATE);
  75. printf("       -o OUTRATE   output samprate   (def=%d) n", DEF_OUTRATE);
  76. printf("       -n CHUNK     chunking size     (def=%d) n", DEF_NCHUNK);
  77. printf("       -q QUALITY   level from 0..3   (def=%d) n", DEF_QUALITY);
  78. printf("       -s           stereo                     n");
  79. exit(0);
  80. }
  81. /*
  82.  * Parse any command-line switches using getopt.
  83.  * Returns the index of first non-switch arg.
  84.  */
  85. int 
  86. ParseArgs(int argc, char **argv)
  87.     int c;
  88. while ((c = getopt(argc, argv, "ci:o:n:q:s")) != EOF) {
  89. switch(c) {
  90. case 'c':
  91. outmode = 1;
  92. break;
  93. case 'i':
  94. inrate = atoi(optarg);
  95. if (!inrate) Usage(argv[0]);
  96. break;
  97. case 'o':
  98. outrate = atoi(optarg);
  99. if (!outrate) Usage(argv[0]);
  100. break;
  101. case 'n':
  102. nchunk = atoi(optarg);
  103. if (!nchunk) Usage(argv[0]);
  104. break;
  105. case 'q':
  106. quality = atoi(optarg);;
  107. if (quality > 3) Usage(argv[0]);
  108. break;
  109. case 's':
  110. chans = 2;
  111. break;
  112. case '?':
  113. default:
  114. Usage(argv[0]);
  115. }
  116. }
  117. return optind;
  118. }
  119. int
  120. main(int argc, char **argv)
  121. {
  122. FILE *infile, *outfile;
  123. short *inbuf, *outbuf;
  124. int inbufsize, outbufsize;
  125. int argnext, incount, outcount, starttime;
  126. int nread, ninput, noutput, nwanted, nsaved;
  127. float calctime, audiotime;
  128. void *inst; /* resampler instance */
  129. /* command-line switches */
  130. argnext = ParseArgs(argc, argv);
  131. if (argc - argnext != 2)
  132. Usage(argv[0]);
  133. /* open files */
  134. if ((infile = fopen(argv[argnext++], "rb")) == NULL)
  135. ERROR("Cannot open infile");
  136. if ((outfile = fopen(argv[argnext++], "wb")) == NULL)
  137. ERROR("Cannot open outfile");
  138. /* create resampler */
  139. inst = InitResampler(inrate, outrate, chans, quality);
  140. if (!inst)
  141. ERROR("InitResampler failed");
  142. /* determine buffer sizes */
  143. if (!outmode) {
  144. /* constant-input */
  145. inbufsize = nchunk;
  146. outbufsize = GetMaxOutput(nchunk, inst);
  147. } else {
  148. /* constant-output */
  149. inbufsize = GetMinInput(nchunk, inst);
  150. outbufsize = nchunk + GetMaxOutput(chans, inst);
  151. }
  152. /* allocate buffers */
  153. inbuf = (short *) malloc(inbufsize * sizeof(short));
  154. outbuf = (short *) malloc(outbufsize * sizeof(short));
  155. if (!inbuf || !outbuf)
  156. ERROR("malloc failed");
  157. printf("nConverting %d %s to %d %s (quality=%d %s=%d)n",
  158. inrate, chans==2 ? "STEREO" : "MONO",
  159. outrate, chans==2 ? "STEREO" : "MONO",
  160. quality, outmode ? "outchunk" : "inchunk", nchunk);
  161. incount = 0;
  162. outcount = 0;
  163. starttime = clock();
  164. if (outmode) {
  165. /*
  166.  * Process the file, in constant output chunks.
  167.  */
  168. nsaved = 0;
  169. for (;;) {
  170. /* determine the amount of input needed */
  171. nwanted = MAX(nchunk - nsaved, 0);
  172. ninput = GetMinInput(nwanted, inst);
  173. ASSERT(ninput <= inbufsize);
  174. /* read variable input */
  175. nread = fread(inbuf, sizeof(short), ninput, infile);
  176. incount += nread;
  177. if (nread < ninput)
  178. break; /* not enough input */
  179. /* resample, appending to saved output */
  180. noutput = Resample(inbuf, nread, outbuf + nsaved, inst);
  181. outcount += noutput;
  182. ASSERT(noutput >= nwanted);
  183. ASSERT((nsaved + noutput) >= nchunk);
  184. ASSERT((nsaved + noutput) <= outbufsize);
  185. ASSERT(noutput <= GetMaxOutput(ninput, inst));
  186. /* write constant output */
  187. fwrite(outbuf, sizeof(short), nchunk, outfile);
  188. /* save extra output */
  189. nsaved += noutput - nchunk;
  190. ASSERT(nsaved >= 0);
  191. memcpy(outbuf, outbuf + nchunk, nsaved * sizeof(short));
  192. }
  193. /* resample the remaining input */
  194. noutput = Resample(inbuf, nread, outbuf + nsaved, inst);
  195. outcount += noutput;
  196. /* write the remaining output */
  197. fwrite(outbuf, sizeof(short), nsaved + noutput, outfile);
  198. } else {
  199. /*
  200.  * Process the file, in constant input chunks.
  201.  */
  202. for (;;) {
  203. /* read constant input */
  204. nread = fread(inbuf, sizeof(short), nchunk, infile);
  205. incount += nread;
  206. if (!nread)
  207. break; /* done */
  208. /* resample */
  209. noutput = Resample(inbuf, nread, outbuf, inst);
  210. outcount += noutput;
  211. /* write variable output */
  212. fwrite(outbuf, sizeof(short), noutput, outfile);
  213. }
  214. }
  215. /* print timing info */
  216. calctime = (clock() - starttime) / (float)CLOCKS_PER_SEC;
  217. audiotime = outcount / ((float)outrate * chans);
  218. printf("Processed %0.2fs of audio in %0.2fs ", audiotime, calctime);
  219. printf("[%0.2f%% realtime]n", calctime * 100.0f / audiotime);
  220. FreeResampler(inst);
  221. free(inbuf);
  222. free(outbuf);
  223. fclose(infile);
  224. fclose(outfile);
  225. return 0;
  226. }