1f46fff61745ab9bf19a7075a105e5d96308c5526henrike@webrtc.org/* 2f46fff61745ab9bf19a7075a105e5d96308c5526henrike@webrtc.org * Copyright (c) 2013 The WebRTC project authors. All Rights Reserved. 3f46fff61745ab9bf19a7075a105e5d96308c5526henrike@webrtc.org * 4f46fff61745ab9bf19a7075a105e5d96308c5526henrike@webrtc.org * Use of this source code is governed by a BSD-style license 5f46fff61745ab9bf19a7075a105e5d96308c5526henrike@webrtc.org * that can be found in the LICENSE file in the root of the source 6f46fff61745ab9bf19a7075a105e5d96308c5526henrike@webrtc.org * tree. An additional intellectual property rights grant can be found 7f46fff61745ab9bf19a7075a105e5d96308c5526henrike@webrtc.org * in the file PATENTS. All contributing project authors may 8f46fff61745ab9bf19a7075a105e5d96308c5526henrike@webrtc.org * be found in the AUTHORS file in the root of the source tree. 9f46fff61745ab9bf19a7075a105e5d96308c5526henrike@webrtc.org */ 10f46fff61745ab9bf19a7075a105e5d96308c5526henrike@webrtc.org 11f46fff61745ab9bf19a7075a105e5d96308c5526henrike@webrtc.org#ifndef WEBRTC_MODULES_AUDIO_DEVICE_ANDROID_FINE_AUDIO_BUFFER_H_ 12f46fff61745ab9bf19a7075a105e5d96308c5526henrike@webrtc.org#define WEBRTC_MODULES_AUDIO_DEVICE_ANDROID_FINE_AUDIO_BUFFER_H_ 13f46fff61745ab9bf19a7075a105e5d96308c5526henrike@webrtc.org 14f46fff61745ab9bf19a7075a105e5d96308c5526henrike@webrtc.org#include "webrtc/system_wrappers/interface/scoped_ptr.h" 15f46fff61745ab9bf19a7075a105e5d96308c5526henrike@webrtc.org#include "webrtc/typedefs.h" 16f46fff61745ab9bf19a7075a105e5d96308c5526henrike@webrtc.org 17f46fff61745ab9bf19a7075a105e5d96308c5526henrike@webrtc.orgnamespace webrtc { 18f46fff61745ab9bf19a7075a105e5d96308c5526henrike@webrtc.org 19f46fff61745ab9bf19a7075a105e5d96308c5526henrike@webrtc.orgclass AudioDeviceBuffer; 20f46fff61745ab9bf19a7075a105e5d96308c5526henrike@webrtc.org 21f46fff61745ab9bf19a7075a105e5d96308c5526henrike@webrtc.org// FineAudioBuffer takes an AudioDeviceBuffer which delivers audio data 22f46fff61745ab9bf19a7075a105e5d96308c5526henrike@webrtc.org// corresponding to 10ms of data. It then allows for this data to be pulled in 23f46fff61745ab9bf19a7075a105e5d96308c5526henrike@webrtc.org// a finer or coarser granularity. I.e. interacting with this class instead of 24f46fff61745ab9bf19a7075a105e5d96308c5526henrike@webrtc.org// directly with the AudioDeviceBuffer one can ask for any number of audio data 25f46fff61745ab9bf19a7075a105e5d96308c5526henrike@webrtc.org// samples. 26f46fff61745ab9bf19a7075a105e5d96308c5526henrike@webrtc.orgclass FineAudioBuffer { 27f46fff61745ab9bf19a7075a105e5d96308c5526henrike@webrtc.org public: 28f46fff61745ab9bf19a7075a105e5d96308c5526henrike@webrtc.org // |device_buffer| is a buffer that provides 10ms of audio data. 29f46fff61745ab9bf19a7075a105e5d96308c5526henrike@webrtc.org // |desired_frame_size_bytes| is the number of bytes of audio data 30f46fff61745ab9bf19a7075a105e5d96308c5526henrike@webrtc.org // (not samples) |GetBufferData| should return on success. 31f46fff61745ab9bf19a7075a105e5d96308c5526henrike@webrtc.org // |sample_rate| is the sample rate of the audio data. This is needed because 32f46fff61745ab9bf19a7075a105e5d96308c5526henrike@webrtc.org // |device_buffer| delivers 10ms of data. Given the sample rate the number 33f46fff61745ab9bf19a7075a105e5d96308c5526henrike@webrtc.org // of samples can be calculated. 34f46fff61745ab9bf19a7075a105e5d96308c5526henrike@webrtc.org FineAudioBuffer(AudioDeviceBuffer* device_buffer, 35f46fff61745ab9bf19a7075a105e5d96308c5526henrike@webrtc.org int desired_frame_size_bytes, 36f46fff61745ab9bf19a7075a105e5d96308c5526henrike@webrtc.org int sample_rate); 37f46fff61745ab9bf19a7075a105e5d96308c5526henrike@webrtc.org ~FineAudioBuffer(); 38f46fff61745ab9bf19a7075a105e5d96308c5526henrike@webrtc.org 39f46fff61745ab9bf19a7075a105e5d96308c5526henrike@webrtc.org // Returns the required size of |buffer| when calling GetBufferData. If the 40f46fff61745ab9bf19a7075a105e5d96308c5526henrike@webrtc.org // buffer is smaller memory trampling will happen. 41f46fff61745ab9bf19a7075a105e5d96308c5526henrike@webrtc.org // |desired_frame_size_bytes| and |samples_rate| are as described in the 42f46fff61745ab9bf19a7075a105e5d96308c5526henrike@webrtc.org // constructor. 43f46fff61745ab9bf19a7075a105e5d96308c5526henrike@webrtc.org int RequiredBufferSizeBytes(); 44f46fff61745ab9bf19a7075a105e5d96308c5526henrike@webrtc.org 45f46fff61745ab9bf19a7075a105e5d96308c5526henrike@webrtc.org // |buffer| must be of equal or greater size than what is returned by 46f46fff61745ab9bf19a7075a105e5d96308c5526henrike@webrtc.org // RequiredBufferSize. This is to avoid unnecessary memcpy. 47f46fff61745ab9bf19a7075a105e5d96308c5526henrike@webrtc.org void GetBufferData(int8_t* buffer); 48f46fff61745ab9bf19a7075a105e5d96308c5526henrike@webrtc.org 49f46fff61745ab9bf19a7075a105e5d96308c5526henrike@webrtc.org private: 50f46fff61745ab9bf19a7075a105e5d96308c5526henrike@webrtc.org // Device buffer that provides 10ms chunks of data. 51f46fff61745ab9bf19a7075a105e5d96308c5526henrike@webrtc.org AudioDeviceBuffer* device_buffer_; 52f46fff61745ab9bf19a7075a105e5d96308c5526henrike@webrtc.org int desired_frame_size_bytes_; // Number of bytes delivered per GetBufferData 53f46fff61745ab9bf19a7075a105e5d96308c5526henrike@webrtc.org int sample_rate_; 54f46fff61745ab9bf19a7075a105e5d96308c5526henrike@webrtc.org int samples_per_10_ms_; 55f46fff61745ab9bf19a7075a105e5d96308c5526henrike@webrtc.org // Convenience parameter to avoid converting from samples 56f46fff61745ab9bf19a7075a105e5d96308c5526henrike@webrtc.org int bytes_per_10_ms_; 57f46fff61745ab9bf19a7075a105e5d96308c5526henrike@webrtc.org 58f46fff61745ab9bf19a7075a105e5d96308c5526henrike@webrtc.org // Storage for samples that are not yet asked for. 59ba47616ee5a8d8a4d94e160b64b79a56845e291bandrew@webrtc.org scoped_ptr<int8_t[]> cache_buffer_; 60f46fff61745ab9bf19a7075a105e5d96308c5526henrike@webrtc.org int cached_buffer_start_; // Location of first unread sample. 61f46fff61745ab9bf19a7075a105e5d96308c5526henrike@webrtc.org int cached_bytes_; // Number of bytes stored in cache. 62f46fff61745ab9bf19a7075a105e5d96308c5526henrike@webrtc.org}; 63f46fff61745ab9bf19a7075a105e5d96308c5526henrike@webrtc.org 64f46fff61745ab9bf19a7075a105e5d96308c5526henrike@webrtc.org} // namespace webrtc 65f46fff61745ab9bf19a7075a105e5d96308c5526henrike@webrtc.org 66f46fff61745ab9bf19a7075a105e5d96308c5526henrike@webrtc.org#endif // WEBRTC_MODULES_AUDIO_DEVICE_ANDROID_FINE_AUDIO_BUFFER_H_ 67