14a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project/*---------------------------------------------------------------------------*
24a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *  AudioHardwareRecord.c  *
34a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *                                                                           *
44a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
54a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *                                                                           *
64a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *  Licensed under the Apache License, Version 2.0 (the 'License');          *
74a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *  you may not use this file except in compliance with the License.         *
84a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *                                                                           *
94a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *  You may obtain a copy of the License at                                  *
104a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0                           *
114a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *                                                                           *
124a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *  Unless required by applicable law or agreed to in writing, software      *
134a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *  distributed under the License is distributed on an 'AS IS' BASIS,        *
144a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
154a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *  See the License for the specific language governing permissions and      *
164a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *  limitations under the License.                                           *
174a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *                                                                           *
184a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *---------------------------------------------------------------------------*/
194a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
204a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include <stdlib.h>
214a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include <stdio.h>
224a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include <limits.h>
234a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include <string.h>
244a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include "audioinwrapper.h"
254a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
264a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#define SAMPLING_RATE       44100
274a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
284a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#define N_FRAMES_PER_BUFFER   512  /* low-level driver counts in terms of frames, not samples */
294a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#define N_TUPLES_PER_FRAME      1  /* tuple: a set of samples (set of 1 if mono, set of 2 if stereo */
304a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
314a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#define N_CHANNELS_PER_TUPLE    1  /* 1: mono; 2: stereo */
324a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
334a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#define N_TUPLES_PER_BUFFER   (N_FRAMES_PER_BUFFER * N_TUPLES_PER_FRAME)
344a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#define N_SAMPLES_PER_BUFFER  (N_TUPLES_PER_BUFFER * N_CHANNELS_PER_TUPLE)
354a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
364a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#define N_SECONDS_TO_RECORD    10
374a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#define N_SAMPLES_TO_RECORD   (SAMPLING_RATE * N_SECONDS_TO_RECORD * N_CHANNELS_PER_TUPLE)
384a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
394a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projecttypedef short typeSample;
404a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
414a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project/* store incoming samples here, then write to file at the end */
424a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjecttypeSample recordedSamples[N_SAMPLES_TO_RECORD];
434a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
444a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
454a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectint main(int argc, char* argv[])
464a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
474a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    int           rc;
484a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    unsigned int  i;
494a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
504a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    memset(recordedSamples, 0, N_SAMPLES_TO_RECORD * sizeof(typeSample));
514a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
524a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    rc = AudioSetInputFormat(SAMPLING_RATE, N_CHANNELS_PER_TUPLE);
534a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    if (rc != 0)
544a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    {
554a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        printf("ERROR: AudioSetInputFormat() returns %d\n", rc);
564a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        exit(1);
574a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    }
584a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
594a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    rc = AudioOpen();
604a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    if (rc < 0)
614a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    {
624a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        printf("ERROR: AudioOpen() returns %d (device handle/ID)\n", rc);
634a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        exit(1);
644a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    }
654a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
664a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    i = 0;
674a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    while (i <= N_SAMPLES_TO_RECORD - N_SAMPLES_PER_BUFFER)
684a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    {
694a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        rc = AudioRead(&(recordedSamples[i]), N_FRAMES_PER_BUFFER);
704a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        if (rc > 0)
714a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project            i += (rc * N_TUPLES_PER_FRAME * N_CHANNELS_PER_TUPLE);
724a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        else
734a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project            printf("ERROR: AudioRead() returns %d\n", rc);
744a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    }
754a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
764a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    rc = AudioClose();
774a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    if (rc != 0)
784a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    {
794a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        printf("ERROR: AudioClose() returns %d\n", rc);
804a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        exit(1);
814a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    }
824a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
834a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    /* write to file  */
844a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    {
854a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        FILE *fpOutput;
864a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        char *szFilename = "output_AudioHardwareRecord.pcm";
874a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
884a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        fpOutput = fopen(szFilename, "wb");
894a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        if (fpOutput == NULL)
904a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        {
914a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project            printf("ERROR: cannot create '%s'\n", szFilename);
924a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project            exit(1);
934a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        }
944a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        fwrite(recordedSamples, sizeof(typeSample), i, fpOutput);
954a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        fclose(fpOutput);
964a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    }
974a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
984a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    return 0;
994a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
100