1207ec2930dd429e5d4aa58e2b9899e09aa76e22cGlenn Kasten/*
2207ec2930dd429e5d4aa58e2b9899e09aa76e22cGlenn Kasten * Copyright (C) 2012 The Android Open Source Project
3207ec2930dd429e5d4aa58e2b9899e09aa76e22cGlenn Kasten *
4207ec2930dd429e5d4aa58e2b9899e09aa76e22cGlenn Kasten * Licensed under the Apache License, Version 2.0 (the "License");
5207ec2930dd429e5d4aa58e2b9899e09aa76e22cGlenn Kasten * you may not use this file except in compliance with the License.
6207ec2930dd429e5d4aa58e2b9899e09aa76e22cGlenn Kasten * You may obtain a copy of the License at
7207ec2930dd429e5d4aa58e2b9899e09aa76e22cGlenn Kasten *
8207ec2930dd429e5d4aa58e2b9899e09aa76e22cGlenn Kasten *      http://www.apache.org/licenses/LICENSE-2.0
9207ec2930dd429e5d4aa58e2b9899e09aa76e22cGlenn Kasten *
10207ec2930dd429e5d4aa58e2b9899e09aa76e22cGlenn Kasten * Unless required by applicable law or agreed to in writing, software
11207ec2930dd429e5d4aa58e2b9899e09aa76e22cGlenn Kasten * distributed under the License is distributed on an "AS IS" BASIS,
12207ec2930dd429e5d4aa58e2b9899e09aa76e22cGlenn Kasten * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13207ec2930dd429e5d4aa58e2b9899e09aa76e22cGlenn Kasten * See the License for the specific language governing permissions and
14207ec2930dd429e5d4aa58e2b9899e09aa76e22cGlenn Kasten * limitations under the License.
15207ec2930dd429e5d4aa58e2b9899e09aa76e22cGlenn Kasten */
16207ec2930dd429e5d4aa58e2b9899e09aa76e22cGlenn Kasten
17207ec2930dd429e5d4aa58e2b9899e09aa76e22cGlenn Kasten#ifndef __AUDIO_UTIL_SNDFILE_H
18207ec2930dd429e5d4aa58e2b9899e09aa76e22cGlenn Kasten#define __AUDIO_UTIL_SNDFILE_H
19207ec2930dd429e5d4aa58e2b9899e09aa76e22cGlenn Kasten
20207ec2930dd429e5d4aa58e2b9899e09aa76e22cGlenn Kasten// This is a C library for reading and writing PCM .wav files.  It is
21207ec2930dd429e5d4aa58e2b9899e09aa76e22cGlenn Kasten// influenced by other libraries such as libsndfile and audiofile, except is
22207ec2930dd429e5d4aa58e2b9899e09aa76e22cGlenn Kasten// much smaller and has an Apache 2.0 license.
23207ec2930dd429e5d4aa58e2b9899e09aa76e22cGlenn Kasten// The API should be familiar to clients of similar libraries, but there is
24207ec2930dd429e5d4aa58e2b9899e09aa76e22cGlenn Kasten// no guarantee that it will stay exactly source-code compatible with other libraries.
25207ec2930dd429e5d4aa58e2b9899e09aa76e22cGlenn Kasten
26207ec2930dd429e5d4aa58e2b9899e09aa76e22cGlenn Kasten#include <stdio.h>
2736c248b94fd41c0f0bb54106ce8e2b0ad67c40eeGlenn Kasten#include <sys/cdefs.h>
2836c248b94fd41c0f0bb54106ce8e2b0ad67c40eeGlenn Kasten
2936c248b94fd41c0f0bb54106ce8e2b0ad67c40eeGlenn Kasten__BEGIN_DECLS
30207ec2930dd429e5d4aa58e2b9899e09aa76e22cGlenn Kasten
31207ec2930dd429e5d4aa58e2b9899e09aa76e22cGlenn Kasten// visible to clients
3236c248b94fd41c0f0bb54106ce8e2b0ad67c40eeGlenn Kastentypedef int sf_count_t;
3336c248b94fd41c0f0bb54106ce8e2b0ad67c40eeGlenn Kasten
34207ec2930dd429e5d4aa58e2b9899e09aa76e22cGlenn Kastentypedef struct {
3536c248b94fd41c0f0bb54106ce8e2b0ad67c40eeGlenn Kasten    sf_count_t frames;
36207ec2930dd429e5d4aa58e2b9899e09aa76e22cGlenn Kasten    int samplerate;
37207ec2930dd429e5d4aa58e2b9899e09aa76e22cGlenn Kasten    int channels;
38207ec2930dd429e5d4aa58e2b9899e09aa76e22cGlenn Kasten    int format;
39207ec2930dd429e5d4aa58e2b9899e09aa76e22cGlenn Kasten} SF_INFO;
40207ec2930dd429e5d4aa58e2b9899e09aa76e22cGlenn Kasten
41207ec2930dd429e5d4aa58e2b9899e09aa76e22cGlenn Kasten// opaque to clients
42207ec2930dd429e5d4aa58e2b9899e09aa76e22cGlenn Kastentypedef struct SNDFILE_ SNDFILE;
43207ec2930dd429e5d4aa58e2b9899e09aa76e22cGlenn Kasten
44207ec2930dd429e5d4aa58e2b9899e09aa76e22cGlenn Kasten// Access modes
45eae13ddb9a4fdedf3895a10cdf5c0a4aefe0ff60Glenn Kasten#define SFM_READ    1
46eae13ddb9a4fdedf3895a10cdf5c0a4aefe0ff60Glenn Kasten#define SFM_WRITE   2
47207ec2930dd429e5d4aa58e2b9899e09aa76e22cGlenn Kasten
48207ec2930dd429e5d4aa58e2b9899e09aa76e22cGlenn Kasten// Format
49207ec2930dd429e5d4aa58e2b9899e09aa76e22cGlenn Kasten#define SF_FORMAT_TYPEMASK  1
50207ec2930dd429e5d4aa58e2b9899e09aa76e22cGlenn Kasten#define SF_FORMAT_WAV       1
51c0bd7157d2d5967a6b222a5d69b7703612f78a49Glenn Kasten#define SF_FORMAT_SUBMASK   14
52207ec2930dd429e5d4aa58e2b9899e09aa76e22cGlenn Kasten#define SF_FORMAT_PCM_16    2
53207ec2930dd429e5d4aa58e2b9899e09aa76e22cGlenn Kasten#define SF_FORMAT_PCM_U8    4
54c0bd7157d2d5967a6b222a5d69b7703612f78a49Glenn Kasten#define SF_FORMAT_FLOAT     6
55c0bd7157d2d5967a6b222a5d69b7703612f78a49Glenn Kasten#define SF_FORMAT_PCM_32    8
56207ec2930dd429e5d4aa58e2b9899e09aa76e22cGlenn Kasten
57207ec2930dd429e5d4aa58e2b9899e09aa76e22cGlenn Kasten// Open stream
58207ec2930dd429e5d4aa58e2b9899e09aa76e22cGlenn KastenSNDFILE *sf_open(const char *path, int mode, SF_INFO *info);
59207ec2930dd429e5d4aa58e2b9899e09aa76e22cGlenn Kasten
60207ec2930dd429e5d4aa58e2b9899e09aa76e22cGlenn Kasten// Close stream
61207ec2930dd429e5d4aa58e2b9899e09aa76e22cGlenn Kastenvoid sf_close(SNDFILE *handle);
62207ec2930dd429e5d4aa58e2b9899e09aa76e22cGlenn Kasten
63207ec2930dd429e5d4aa58e2b9899e09aa76e22cGlenn Kasten// Read interleaved frames and return actual number of frames read
6436c248b94fd41c0f0bb54106ce8e2b0ad67c40eeGlenn Kastensf_count_t sf_readf_short(SNDFILE *handle, short *ptr, sf_count_t desired);
65c0bd7157d2d5967a6b222a5d69b7703612f78a49Glenn Kastensf_count_t sf_readf_float(SNDFILE *handle, float *ptr, sf_count_t desired);
667b9378104f3709d6c07ed00fe11066860a4e9999Andy Hungsf_count_t sf_readf_int(SNDFILE *handle, int *ptr, sf_count_t desired);
6736c248b94fd41c0f0bb54106ce8e2b0ad67c40eeGlenn Kasten
68eae13ddb9a4fdedf3895a10cdf5c0a4aefe0ff60Glenn Kasten// Write interleaved frames and return actual number of frames written
69eae13ddb9a4fdedf3895a10cdf5c0a4aefe0ff60Glenn Kastensf_count_t sf_writef_short(SNDFILE *handle, const short *ptr, sf_count_t desired);
70c0bd7157d2d5967a6b222a5d69b7703612f78a49Glenn Kastensf_count_t sf_writef_float(SNDFILE *handle, const float *ptr, sf_count_t desired);
71eae13ddb9a4fdedf3895a10cdf5c0a4aefe0ff60Glenn Kasten
7236c248b94fd41c0f0bb54106ce8e2b0ad67c40eeGlenn Kasten__END_DECLS
73207ec2930dd429e5d4aa58e2b9899e09aa76e22cGlenn Kasten
74207ec2930dd429e5d4aa58e2b9899e09aa76e22cGlenn Kasten#endif /* __AUDIO_UTIL_SNDFILE_H */
75