/*
 * Copyright (C) 2016 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

//
// Interface to the A2DP aptX-HD Encoder
//

#ifndef A2DP_VENDOR_APTX_HD_ENCODER_H
#define A2DP_VENDOR_APTX_HD_ENCODER_H

#include "a2dp_codec_api.h"
#include "osi/include/time.h"

// Loads the A2DP aptX-HD encoder.
// Return true on success, otherwise false.
bool A2DP_VendorLoadEncoderAptxHd(void);

// Unloads the A2DP aptX-HD encoder.
void A2DP_VendorUnloadEncoderAptxHd(void);

// Initialize the A2DP aptX-HD encoder.
// |p_peer_params| contains the A2DP peer information.
// The current A2DP codec config is in |a2dp_codec_config|.
// |read_callback| is the callback for reading the input audio data.
// |enqueue_callback| is the callback for enqueueing the encoded audio data.
void a2dp_vendor_aptx_hd_encoder_init(
    const tA2DP_ENCODER_INIT_PEER_PARAMS* p_peer_params,
    A2dpCodecConfig* a2dp_codec_config,
    a2dp_source_read_callback_t read_callback,
    a2dp_source_enqueue_callback_t enqueue_callback);

// Cleanup the A2DP aptX-HD encoder.
void a2dp_vendor_aptx_hd_encoder_cleanup(void);

// Reset the feeding for the A2DP aptX-HD encoder.
void a2dp_vendor_aptx_hd_feeding_reset(void);

// Flush the feeding for the A2DP aptX-HD encoder.
void a2dp_vendor_aptx_hd_feeding_flush(void);

// Get the A2DP aptX-HD encoder interval (in milliseconds).
period_ms_t a2dp_vendor_aptx_hd_get_encoder_interval_ms(void);

// Prepare and send A2DP aptX-HD encoded frames.
// |timestamp_us| is the current timestamp (in microseconds).
void a2dp_vendor_aptx_hd_send_frames(uint64_t timestamp_us);

#endif  // A2DP_VENDOR_APTX_HD_ENCODER_H
