/*
 * 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 LDAC Encoder
//

#ifndef A2DP_VENDOR_LDAC_ENCODER_H
#define A2DP_VENDOR_LDAC_ENCODER_H

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

// Loads the A2DP LDAC encoder.
// Return true on success, otherwise false.
bool A2DP_VendorLoadEncoderLdac(void);

// Unloads the A2DP LDAC encoder.
void A2DP_VendorUnloadEncoderLdac(void);

// Initialize the A2DP LDAC 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_ldac_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 LDAC encoder.
void a2dp_vendor_ldac_encoder_cleanup(void);

// Reset the feeding for the A2DP LDAC encoder.
void a2dp_vendor_ldac_feeding_reset(void);

// Flush the feeding for the A2DP LDAC encoder.
void a2dp_vendor_ldac_feeding_flush(void);

// Get the A2DP LDAC encoder interval (in milliseconds).
period_ms_t a2dp_vendor_ldac_get_encoder_interval_ms(void);

// Prepare and send A2DP LDAC encoded frames.
// |timestamp_us| is the current timestamp (in microseconds).
void a2dp_vendor_ldac_send_frames(uint64_t timestamp_us);

// Set transmit queue length for the A2DP LDAC ABR(Adaptive Bit Rate) mechanism.
void a2dp_vendor_ldac_set_transmit_queue_length(size_t transmit_queue_length);

#endif  // A2DP_VENDOR_LDAC_ENCODER_H
