resampler.h revision b3184d71bc6cee9fcbb36343e379143329be00ce
1/* 2** Copyright 2008, The Android Open-Source Project 3** 4** Licensed under the Apache License, Version 2.0 (the "License"); 5** you may not use this file except in compliance with the License. 6** You may obtain a copy of the License at 7** 8** http://www.apache.org/licenses/LICENSE-2.0 9** 10** Unless required by applicable law or agreed to in writing, software 11** distributed under the License is distributed on an "AS IS" BASIS, 12** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13** See the License for the specific language governing permissions and 14** limitations under the License. 15*/ 16 17#ifndef ANDROID_RESAMPLER_H 18#define ANDROID_RESAMPLER_H 19 20#include <stdint.h> 21#include <sys/time.h> 22 23__BEGIN_DECLS 24 25 26#define RESAMPLER_QUALITY_MAX 10 27#define RESAMPLER_QUALITY_MIN 0 28#define RESAMPLER_QUALITY_DEFAULT 4 29#define RESAMPLER_QUALITY_VOIP 3 30#define RESAMPLER_QUALITY_DESKTOP 5 31 32struct resampler_buffer { 33 union { 34 void* raw; 35 short* i16; 36 int8_t* i8; 37 }; 38 size_t frame_count; 39}; 40 41/* call back interface used by the resampler to get new data */ 42struct resampler_buffer_provider 43{ 44 /** 45 * get a new buffer of data: 46 * as input: buffer->frame_count is the number of frames requested 47 * as output: buffer->frame_count is the number of frames returned 48 * buffer->raw points to data returned 49 */ 50 int (*get_next_buffer)(struct resampler_buffer_provider *provider, 51 struct resampler_buffer *buffer); 52 /** 53 * release a consumed buffer of data: 54 * as input: buffer->frame_count is the number of frames released 55 * buffer->raw points to data released 56 */ 57 void (*release_buffer)(struct resampler_buffer_provider *provider, 58 struct resampler_buffer *buffer); 59}; 60 61/* resampler interface */ 62struct resampler_itfe { 63 /** 64 * reset resampler state 65 */ 66 void (*reset)(struct resampler_itfe *resampler); 67 /** 68 * resample input from buffer provider and output at most *outFrameCount to out buffer. 69 * *outFrameCount is updated with the actual number of frames produced. 70 */ 71 int (*resample_from_provider)(struct resampler_itfe *resampler, 72 int16_t *out, 73 size_t *outFrameCount); 74 /** 75 * resample at most *inFrameCount frames from in buffer and output at most 76 * *outFrameCount to out buffer. *inFrameCount and *outFrameCount are updated respectively 77 * with the number of frames remaining in input and written to output. 78 */ 79 int (*resample_from_input)(struct resampler_itfe *resampler, 80 int16_t *in, 81 size_t *inFrameCount, 82 int16_t *out, 83 size_t *outFrameCount); 84 /** 85 * return the latency introduced by the resampler in ns. 86 */ 87 int32_t (*delay_ns)(struct resampler_itfe *resampler); 88}; 89 90/** 91 * create a resampler according to input parameters passed. 92 * If resampler_buffer_provider is not NULL only resample_from_provider() can be called. 93 * If resampler_buffer_provider is NULL only resample_from_input() can be called. 94 */ 95int create_resampler(uint32_t inSampleRate, 96 uint32_t outSampleRate, 97 uint32_t channelCount, 98 uint32_t quality, 99 struct resampler_buffer_provider *provider, 100 struct resampler_itfe **); 101 102/** 103 * release resampler resources. 104 */ 105void release_resampler(struct resampler_itfe *); 106 107__END_DECLS 108 109#endif // ANDROID_RESAMPLER_H 110