Home | History | Annotate | Download | only in audio_utils
      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 
     32 struct 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 */
     42 struct 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 */
     62 struct 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  */
     95 int 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  */
    105 void release_resampler(struct resampler_itfe *);
    106 
    107 __END_DECLS
    108 
    109 #endif // ANDROID_RESAMPLER_H
    110