1/*---------------------------------------------------------------------------*
2 *  AudioHardwareRecord.c  *
3 *                                                                           *
4 *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
5 *                                                                           *
6 *  Licensed under the Apache License, Version 2.0 (the 'License');          *
7 *  you may not use this file except in compliance with the License.         *
8 *                                                                           *
9 *  You may obtain a copy of the License at                                  *
10 *      http://www.apache.org/licenses/LICENSE-2.0                           *
11 *                                                                           *
12 *  Unless required by applicable law or agreed to in writing, software      *
13 *  distributed under the License is distributed on an 'AS IS' BASIS,        *
14 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
15 *  See the License for the specific language governing permissions and      *
16 *  limitations under the License.                                           *
17 *                                                                           *
18 *---------------------------------------------------------------------------*/
19
20#include <stdlib.h>
21#include <stdio.h>
22#include <limits.h>
23#include <string.h>
24#include "audioinwrapper.h"
25
26#define SAMPLING_RATE       44100
27
28#define N_FRAMES_PER_BUFFER   512  /* low-level driver counts in terms of frames, not samples */
29#define N_TUPLES_PER_FRAME      1  /* tuple: a set of samples (set of 1 if mono, set of 2 if stereo */
30
31#define N_CHANNELS_PER_TUPLE    1  /* 1: mono; 2: stereo */
32
33#define N_TUPLES_PER_BUFFER   (N_FRAMES_PER_BUFFER * N_TUPLES_PER_FRAME)
34#define N_SAMPLES_PER_BUFFER  (N_TUPLES_PER_BUFFER * N_CHANNELS_PER_TUPLE)
35
36#define N_SECONDS_TO_RECORD    10
37#define N_SAMPLES_TO_RECORD   (SAMPLING_RATE * N_SECONDS_TO_RECORD * N_CHANNELS_PER_TUPLE)
38
39typedef short typeSample;
40
41/* store incoming samples here, then write to file at the end */
42typeSample recordedSamples[N_SAMPLES_TO_RECORD];
43
44
45int main(int argc, char* argv[])
46{
47    int           rc;
48    unsigned int  i;
49
50    memset(recordedSamples, 0, N_SAMPLES_TO_RECORD * sizeof(typeSample));
51
52    rc = AudioSetInputFormat(SAMPLING_RATE, N_CHANNELS_PER_TUPLE);
53    if (rc != 0)
54    {
55        printf("ERROR: AudioSetInputFormat() returns %d\n", rc);
56        exit(1);
57    }
58
59    rc = AudioOpen();
60    if (rc < 0)
61    {
62        printf("ERROR: AudioOpen() returns %d (device handle/ID)\n", rc);
63        exit(1);
64    }
65
66    i = 0;
67    while (i <= N_SAMPLES_TO_RECORD - N_SAMPLES_PER_BUFFER)
68    {
69        rc = AudioRead(&(recordedSamples[i]), N_FRAMES_PER_BUFFER);
70        if (rc > 0)
71            i += (rc * N_TUPLES_PER_FRAME * N_CHANNELS_PER_TUPLE);
72        else
73            printf("ERROR: AudioRead() returns %d\n", rc);
74    }
75
76    rc = AudioClose();
77    if (rc != 0)
78    {
79        printf("ERROR: AudioClose() returns %d\n", rc);
80        exit(1);
81    }
82
83    /* write to file  */
84    {
85        FILE *fpOutput;
86        char *szFilename = "output_AudioHardwareRecord.pcm";
87
88        fpOutput = fopen(szFilename, "wb");
89        if (fpOutput == NULL)
90        {
91            printf("ERROR: cannot create '%s'\n", szFilename);
92            exit(1);
93        }
94        fwrite(recordedSamples, sizeof(typeSample), i, fpOutput);
95        fclose(fpOutput);
96    }
97
98    return 0;
99}
100