audio_hw_hal.cpp revision 4113f34dfbaa8d82a5e1ef0265e916317161984d
14765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev/*
24765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev * Copyright (C) 2011 The Android Open Source Project
34765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev * Copyright (c) 2011-2012, Code Aurora Forum. All rights reserved.
44765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev *
54765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev * Licensed under the Apache License, Version 2.0 (the "License");
64765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev * you may not use this file except in compliance with the License.
74765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev * You may obtain a copy of the License at
84765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev *
94765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev *      http://www.apache.org/licenses/LICENSE-2.0
104765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev *
114765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev * Unless required by applicable law or agreed to in writing, software
124765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev * distributed under the License is distributed on an "AS IS" BASIS,
134765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
144765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev * See the License for the specific language governing permissions and
154765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev * limitations under the License.
164765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev */
174765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
184113f34dfbaa8d82a5e1ef0265e916317161984dIliyan Malchev#define LOG_TAG "audio.primary.msm8960"
194765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev//#define LOG_NDEBUG 0
204765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
214765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev#include <stdint.h>
224765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
234765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev#include <hardware/hardware.h>
244765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev#include <system/audio.h>
254765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev#include <hardware/audio.h>
264765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
274765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev#include <hardware_legacy/AudioHardwareInterface.h>
284765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev#include <hardware_legacy/AudioSystemLegacy.h>
294765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
304765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevnamespace android_audio_legacy {
314765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
324765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevextern "C" {
334765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
344765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevstruct qcom_audio_module {
354765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    struct audio_module module;
364765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev};
374765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
384765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevstruct qcom_audio_device {
394765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    struct audio_hw_device device;
404765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
414765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    struct AudioHardwareInterface *hwif;
424765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev};
434765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
444765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevstruct qcom_stream_out {
454765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    struct audio_stream_out stream;
464765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
474765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    AudioStreamOut *qcom_out;
484765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev};
494765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
504765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevstruct qcom_stream_in {
514765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    struct audio_stream_in stream;
524765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
534765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    AudioStreamIn *qcom_in;
544765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev};
554765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
564765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev/** audio_stream_out implementation **/
574765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevstatic uint32_t out_get_sample_rate(const struct audio_stream *stream)
584765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev{
594765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    const struct qcom_stream_out *out =
604765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        reinterpret_cast<const struct qcom_stream_out *>(stream);
614765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    return out->qcom_out->sampleRate();
624765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev}
634765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
644765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevstatic int out_set_sample_rate(struct audio_stream *stream, uint32_t rate)
654765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev{
664765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    struct qcom_stream_out *out =
674765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        reinterpret_cast<struct qcom_stream_out *>(stream);
684765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
694113f34dfbaa8d82a5e1ef0265e916317161984dIliyan Malchev    ALOGE("(%s:%d) %s: Implement me!", __FILE__, __LINE__, __func__);
704765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    /* TODO: implement this */
714765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    return 0;
724765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev}
734765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
744765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevstatic size_t out_get_buffer_size(const struct audio_stream *stream)
754765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev{
764765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    const struct qcom_stream_out *out =
774765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        reinterpret_cast<const struct qcom_stream_out *>(stream);
784765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    return out->qcom_out->bufferSize();
794765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev}
804765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
814765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevstatic audio_channel_mask_t out_get_channels(const struct audio_stream *stream)
824765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev{
834765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    const struct qcom_stream_out *out =
844765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        reinterpret_cast<const struct qcom_stream_out *>(stream);
854765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    return out->qcom_out->channels();
864765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev}
874765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
884765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevstatic audio_format_t out_get_format(const struct audio_stream *stream)
894765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev{
904765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    const struct qcom_stream_out *out =
914765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        reinterpret_cast<const struct qcom_stream_out *>(stream);
924113f34dfbaa8d82a5e1ef0265e916317161984dIliyan Malchev    return (audio_format_t)out->qcom_out->format();
934765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev}
944765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
954765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevstatic int out_set_format(struct audio_stream *stream, audio_format_t format)
964765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev{
974765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    struct qcom_stream_out *out =
984765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        reinterpret_cast<struct qcom_stream_out *>(stream);
994113f34dfbaa8d82a5e1ef0265e916317161984dIliyan Malchev    ALOGE("(%s:%d) %s: Implement me!", __FILE__, __LINE__, __func__);
1004765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    /* TODO: implement me */
1014765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    return 0;
1024765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev}
1034765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
1044765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevstatic int out_standby(struct audio_stream *stream)
1054765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev{
1064765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    struct qcom_stream_out *out =
1074765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        reinterpret_cast<struct qcom_stream_out *>(stream);
1084765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    return out->qcom_out->standby();
1094765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev}
1104765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
1114765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevstatic int out_dump(const struct audio_stream *stream, int fd)
1124765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev{
1134765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    const struct qcom_stream_out *out =
1144765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        reinterpret_cast<const struct qcom_stream_out *>(stream);
1154765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    Vector<String16> args;
1164765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    return out->qcom_out->dump(fd, args);
1174765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev}
1184765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
1194765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevstatic int out_set_parameters(struct audio_stream *stream, const char *kvpairs)
1204765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev{
1214765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    struct qcom_stream_out *out =
1224765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        reinterpret_cast<struct qcom_stream_out *>(stream);
1234765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    return out->qcom_out->setParameters(String8(kvpairs));
1244765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev}
1254765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
1264765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevstatic char * out_get_parameters(const struct audio_stream *stream, const char *keys)
1274765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev{
1284765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    const struct qcom_stream_out *out =
1294765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        reinterpret_cast<const struct qcom_stream_out *>(stream);
1304765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    String8 s8;
1314765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    s8 = out->qcom_out->getParameters(String8(keys));
1324765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    return strdup(s8.string());
1334765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev}
1344765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
1354765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevstatic uint32_t out_get_latency(const struct audio_stream_out *stream)
1364765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev{
1374765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    const struct qcom_stream_out *out =
1384765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        reinterpret_cast<const struct qcom_stream_out *>(stream);
1394765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    return out->qcom_out->latency();
1404765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev}
1414765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
1424765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevstatic int out_set_volume(struct audio_stream_out *stream, float left,
1434765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev                          float right)
1444765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev{
1454765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    struct qcom_stream_out *out =
1464765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        reinterpret_cast<struct qcom_stream_out *>(stream);
1474765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    return out->qcom_out->setVolume(left, right);
1484765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev}
1494765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
1504765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevstatic ssize_t out_write(struct audio_stream_out *stream, const void* buffer,
1514765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev                         size_t bytes)
1524765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev{
1534765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    struct qcom_stream_out *out =
1544765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        reinterpret_cast<struct qcom_stream_out *>(stream);
1554765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    return out->qcom_out->write(buffer, bytes);
1564765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev}
1574765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
1584765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevstatic int out_get_render_position(const struct audio_stream_out *stream,
1594765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev                                   uint32_t *dsp_frames)
1604765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev{
1614765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    const struct qcom_stream_out *out =
1624765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        reinterpret_cast<const struct qcom_stream_out *>(stream);
1634765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    return out->qcom_out->getRenderPosition(dsp_frames);
1644765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev}
1654765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
1664765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevstatic int out_add_audio_effect(const struct audio_stream *stream, effect_handle_t effect)
1674765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev{
1684765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    return 0;
1694765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev}
1704765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
1714765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevstatic int out_remove_audio_effect(const struct audio_stream *stream, effect_handle_t effect)
1724765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev{
1734765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    return 0;
1744765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev}
1754765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
1764765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevstatic int out_get_next_write_timestamp(const struct audio_stream_out *stream,
1774765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev                                        int64_t *timestamp)
1784765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev{
1794765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    return -EINVAL;
1804765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev}
1814765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
1824765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev/** audio_stream_in implementation **/
1834765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevstatic uint32_t in_get_sample_rate(const struct audio_stream *stream)
1844765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev{
1854765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    const struct qcom_stream_in *in =
1864765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        reinterpret_cast<const struct qcom_stream_in *>(stream);
1874765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    return in->qcom_in->sampleRate();
1884765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev}
1894765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
1904765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevstatic int in_set_sample_rate(struct audio_stream *stream, uint32_t rate)
1914765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev{
1924765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    struct qcom_stream_in *in =
1934765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        reinterpret_cast<struct qcom_stream_in *>(stream);
1944765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
1954113f34dfbaa8d82a5e1ef0265e916317161984dIliyan Malchev    ALOGE("(%s:%d) %s: Implement me!", __FILE__, __LINE__, __func__);
1964765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    /* TODO: implement this */
1974765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    return 0;
1984765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev}
1994765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
2004765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevstatic size_t in_get_buffer_size(const struct audio_stream *stream)
2014765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev{
2024765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    const struct qcom_stream_in *in =
2034765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        reinterpret_cast<const struct qcom_stream_in *>(stream);
2044765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    return in->qcom_in->bufferSize();
2054765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev}
2064765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
2074765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevstatic audio_channel_mask_t in_get_channels(const struct audio_stream *stream)
2084765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev{
2094765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    const struct qcom_stream_in *in =
2104765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        reinterpret_cast<const struct qcom_stream_in *>(stream);
2114765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    return in->qcom_in->channels();
2124765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev}
2134765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
2144765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevstatic audio_format_t in_get_format(const struct audio_stream *stream)
2154765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev{
2164765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    const struct qcom_stream_in *in =
2174765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        reinterpret_cast<const struct qcom_stream_in *>(stream);
2184113f34dfbaa8d82a5e1ef0265e916317161984dIliyan Malchev    return (audio_format_t)in->qcom_in->format();
2194765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev}
2204765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
2214765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevstatic int in_set_format(struct audio_stream *stream, audio_format_t format)
2224765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev{
2234765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    struct qcom_stream_in *in =
2244765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        reinterpret_cast<struct qcom_stream_in *>(stream);
2254113f34dfbaa8d82a5e1ef0265e916317161984dIliyan Malchev    ALOGE("(%s:%d) %s: Implement me!", __FILE__, __LINE__, __func__);
2264765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    /* TODO: implement me */
2274765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    return 0;
2284765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev}
2294765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
2304765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevstatic int in_standby(struct audio_stream *stream)
2314765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev{
2324765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    struct qcom_stream_in *in = reinterpret_cast<struct qcom_stream_in *>(stream);
2334765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    return in->qcom_in->standby();
2344765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev}
2354765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
2364765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevstatic int in_dump(const struct audio_stream *stream, int fd)
2374765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev{
2384765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    const struct qcom_stream_in *in =
2394765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        reinterpret_cast<const struct qcom_stream_in *>(stream);
2404765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    Vector<String16> args;
2414765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    return in->qcom_in->dump(fd, args);
2424765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev}
2434765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
2444765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevstatic int in_set_parameters(struct audio_stream *stream, const char *kvpairs)
2454765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev{
2464765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    struct qcom_stream_in *in =
2474765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        reinterpret_cast<struct qcom_stream_in *>(stream);
2484765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    return in->qcom_in->setParameters(String8(kvpairs));
2494765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev}
2504765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
2514765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevstatic char * in_get_parameters(const struct audio_stream *stream,
2524765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev                                const char *keys)
2534765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev{
2544765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    const struct qcom_stream_in *in =
2554765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        reinterpret_cast<const struct qcom_stream_in *>(stream);
2564765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    String8 s8;
2574765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    s8 = in->qcom_in->getParameters(String8(keys));
2584765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    return strdup(s8.string());
2594765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev}
2604765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
2614765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevstatic int in_set_gain(struct audio_stream_in *stream, float gain)
2624765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev{
2634765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    struct qcom_stream_in *in =
2644765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        reinterpret_cast<struct qcom_stream_in *>(stream);
2654765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    return in->qcom_in->setGain(gain);
2664765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev}
2674765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
2684765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevstatic ssize_t in_read(struct audio_stream_in *stream, void* buffer,
2694765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev                       size_t bytes)
2704765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev{
2714765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    struct qcom_stream_in *in =
2724765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        reinterpret_cast<struct qcom_stream_in *>(stream);
2734765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    return in->qcom_in->read(buffer, bytes);
2744765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev}
2754765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
2764765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevstatic uint32_t in_get_input_frames_lost(struct audio_stream_in *stream)
2774765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev{
2784765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    struct qcom_stream_in *in =
2794765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        reinterpret_cast<struct qcom_stream_in *>(stream);
2804765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    return in->qcom_in->getInputFramesLost();
2814765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev}
2824765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
2834765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevstatic int in_add_audio_effect(const struct audio_stream *stream, effect_handle_t effect)
2844765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev{
2854765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    const struct qcom_stream_in *in =
2864765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        reinterpret_cast<const struct qcom_stream_in *>(stream);
2874765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    return in->qcom_in->addAudioEffect(effect);
2884765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev}
2894765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
2904765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevstatic int in_remove_audio_effect(const struct audio_stream *stream, effect_handle_t effect)
2914765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev{
2924765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    const struct qcom_stream_in *in =
2934765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        reinterpret_cast<const struct qcom_stream_in *>(stream);
2944765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    return in->qcom_in->removeAudioEffect(effect);
2954765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev}
2964765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
2974765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev/** audio_hw_device implementation **/
2984765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevstatic inline struct qcom_audio_device * to_ladev(struct audio_hw_device *dev)
2994765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev{
3004765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    return reinterpret_cast<struct qcom_audio_device *>(dev);
3014765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev}
3024765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
3034765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevstatic inline const struct qcom_audio_device * to_cladev(const struct audio_hw_device *dev)
3044765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev{
3054765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    return reinterpret_cast<const struct qcom_audio_device *>(dev);
3064765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev}
3074765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
3084765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevstatic uint32_t adev_get_supported_devices(const struct audio_hw_device *dev)
3094765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev{
3104765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    /* XXX: The old AudioHardwareInterface interface is not smart enough to
3114765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev     * tell us this, so we'll lie and basically tell AF that we support the
3124765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev     * below input/output devices and cross our fingers. To do things properly,
3134765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev     * audio hardware interfaces that need advanced features (like this) should
3144765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev     * convert to the new HAL interface and not use this wrapper. */
3154765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    return (/* OUT */
3164765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev            AUDIO_DEVICE_OUT_EARPIECE |
3174765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev            AUDIO_DEVICE_OUT_SPEAKER |
3184765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev            AUDIO_DEVICE_OUT_WIRED_HEADSET |
3194765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev            AUDIO_DEVICE_OUT_WIRED_HEADPHONE |
3204765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev            AUDIO_DEVICE_OUT_AUX_DIGITAL |
3214765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev            AUDIO_DEVICE_OUT_ALL_SCO |
3224113f34dfbaa8d82a5e1ef0265e916317161984dIliyan Malchev//          AUDIO_DEVICE_OUT_ANC_HEADSET |
3234765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev            AUDIO_DEVICE_OUT_ANLG_DOCK_HEADSET |
3244765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev            AUDIO_DEVICE_OUT_DGTL_DOCK_HEADSET |
3254113f34dfbaa8d82a5e1ef0265e916317161984dIliyan Malchev//          AUDIO_DEVICE_OUT_ANC_HEADPHONE |
3264113f34dfbaa8d82a5e1ef0265e916317161984dIliyan Malchev//          AUDIO_DEVICE_OUT_FM |
3274113f34dfbaa8d82a5e1ef0265e916317161984dIliyan Malchev//          AUDIO_DEVICE_OUT_FM_TX |
3284113f34dfbaa8d82a5e1ef0265e916317161984dIliyan Malchev//          AUDIO_DEVICE_OUT_DIRECTOUTPUT |
3294113f34dfbaa8d82a5e1ef0265e916317161984dIliyan Malchev//          AUDIO_DEVICE_OUT_PROXY |
3304765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev            AUDIO_DEVICE_OUT_DEFAULT |
3314765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev            /* IN */
3324765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev            AUDIO_DEVICE_IN_VOICE_CALL |
3334765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev            AUDIO_DEVICE_IN_COMMUNICATION |
3344765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev            AUDIO_DEVICE_IN_AMBIENT |
3354765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev            AUDIO_DEVICE_IN_BUILTIN_MIC |
3364765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev            AUDIO_DEVICE_IN_WIRED_HEADSET |
3374765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev            AUDIO_DEVICE_IN_AUX_DIGITAL |
3384765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev            AUDIO_DEVICE_IN_BACK_MIC |
3394765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev            AUDIO_DEVICE_IN_ALL_SCO |
3404113f34dfbaa8d82a5e1ef0265e916317161984dIliyan Malchev//          AUDIO_DEVICE_IN_ANC_HEADSET |
3414113f34dfbaa8d82a5e1ef0265e916317161984dIliyan Malchev//          AUDIO_DEVICE_IN_FM_RX |
3424113f34dfbaa8d82a5e1ef0265e916317161984dIliyan Malchev//          AUDIO_DEVICE_IN_FM_RX_A2DP |
3434765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev            AUDIO_DEVICE_IN_DEFAULT);
3444765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev}
3454765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
3464765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevstatic int adev_init_check(const struct audio_hw_device *dev)
3474765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev{
3484765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    const struct qcom_audio_device *qadev = to_cladev(dev);
3494765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
3504765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    return qadev->hwif->initCheck();
3514765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev}
3524765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
3534765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevstatic int adev_set_voice_volume(struct audio_hw_device *dev, float volume)
3544765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev{
3554765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    struct qcom_audio_device *qadev = to_ladev(dev);
3564765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    return qadev->hwif->setVoiceVolume(volume);
3574765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev}
3584765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
3594765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevstatic int adev_set_master_volume(struct audio_hw_device *dev, float volume)
3604765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev{
3614765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    struct qcom_audio_device *qadev = to_ladev(dev);
3624765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    return qadev->hwif->setMasterVolume(volume);
3634765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev}
3644765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
3654765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevstatic int adev_get_master_volume(struct audio_hw_device *dev, float *volume) {
3664765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
3674113f34dfbaa8d82a5e1ef0265e916317161984dIliyan Malchev    struct qcom_audio_device *qadev = to_ladev(dev);
3684113f34dfbaa8d82a5e1ef0265e916317161984dIliyan Malchev    return qadev->hwif->getMasterVolume(volume);
3694765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev}
3704765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev#ifdef QUALCOMM_FEATURES_ENABLED
3714765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevstatic int adev_set_fm_volume(struct audio_hw_device *dev, float volume)
3724765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev{
3734765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    struct qcom_audio_device *qadev = to_ladev(dev);
3744765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    return qadev->hwif->setFmVolume(volume);
3754765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev}
3764765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev#endif
3774765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
3784765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevstatic int adev_set_mode(struct audio_hw_device *dev, audio_mode_t mode)
3794765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev{
3804765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    struct qcom_audio_device *qadev = to_ladev(dev);
3814765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    return qadev->hwif->setMode(mode);
3824765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev}
3834765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
3844765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevstatic int adev_set_mic_mute(struct audio_hw_device *dev, bool state)
3854765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev{
3864765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    struct qcom_audio_device *qadev = to_ladev(dev);
3874765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    return qadev->hwif->setMicMute(state);
3884765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev}
3894765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
3904765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevstatic int adev_get_mic_mute(const struct audio_hw_device *dev, bool *state)
3914765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev{
3924765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    const struct qcom_audio_device *qadev = to_cladev(dev);
3934765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    return qadev->hwif->getMicMute(state);
3944765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev}
3954765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
3964765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevstatic int adev_set_parameters(struct audio_hw_device *dev, const char *kvpairs)
3974765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev{
3984765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    struct qcom_audio_device *qadev = to_ladev(dev);
3994765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    return qadev->hwif->setParameters(String8(kvpairs));
4004765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev}
4014765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
4024765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevstatic char * adev_get_parameters(const struct audio_hw_device *dev,
4034765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev                                  const char *keys)
4044765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev{
4054765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    const struct qcom_audio_device *qadev = to_cladev(dev);
4064765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    String8 s8;
4074765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
4084765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    s8 = qadev->hwif->getParameters(String8(keys));
4094765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    return strdup(s8.string());
4104765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev}
4114765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
4124765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevstatic size_t adev_get_input_buffer_size(const struct audio_hw_device *dev,
4134765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev                                         const struct audio_config *config)
4144765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev{
4154765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    const struct qcom_audio_device *qadev = to_cladev(dev);
4164113f34dfbaa8d82a5e1ef0265e916317161984dIliyan Malchev    return qadev->hwif->getInputBufferSize(config->sample_rate, config->format, config->channel_mask);
4174765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev}
4184765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
4194765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev#ifdef QUALCOMM_FEATURES_ENABLED
4204765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevstatic int adev_open_output_session(struct audio_hw_device *dev,
4214765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev                                   uint32_t devices,
4224765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev                                   int *format,
4234765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev                                   int sessionId,
4244765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev                                   uint32_t samplingRate,
4254765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev                                   uint32_t channels,
4264765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev                                   struct audio_stream_out **stream_out)
4274765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev{
4284765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    struct qcom_audio_device *qadev = to_ladev(dev);
4294765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    status_t status;
4304765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    struct qcom_stream_out *out;
4314765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    int ret;
4324765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
4334765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    out = (struct qcom_stream_out *)calloc(1, sizeof(*out));
4344765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    if (!out)
4354765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        return -ENOMEM;
4364765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
4374765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    out->qcom_out = qadev->hwif->openOutputSession(devices, format,&status,sessionId,samplingRate,channels);
4384765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    if (!out->qcom_out) {
4394765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        ret = status;
4404765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        goto err_open;
4414765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    }
4424765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
4434765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    out->stream.common.standby = out_standby;
4444765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    out->stream.common.set_parameters = out_set_parameters;
4454765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    out->stream.set_volume = out_set_volume;
4464765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
4474765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    *stream_out = &out->stream;
4484765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    return 0;
4494765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
4504765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malcheverr_open:
4514765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    free(out);
4524765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    *stream_out = NULL;
4534765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    return ret;
4544765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev}
4554765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev#endif
4564765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
4574765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevstatic int adev_open_output_stream(struct audio_hw_device *dev,
4584765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev                                   audio_io_handle_t handle,
4594765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev                                   audio_devices_t devices,
4604765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev                                   audio_output_flags_t flags,
4614765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev                                   struct audio_config *config,
4624765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev                                   struct audio_stream_out **stream_out)
4634765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev{
4644765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    struct qcom_audio_device *qadev = to_ladev(dev);
4654765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    status_t status;
4664765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    struct qcom_stream_out *out;
4674765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    int ret;
4684765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
4694765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    out = (struct qcom_stream_out *)calloc(1, sizeof(*out));
4704765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    if (!out)
4714765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        return -ENOMEM;
4724765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
4734113f34dfbaa8d82a5e1ef0265e916317161984dIliyan Malchev    out->qcom_out = qadev->hwif->openOutputStream(devices,
4744113f34dfbaa8d82a5e1ef0265e916317161984dIliyan Malchev                                                    (int *)&config->format,
4754113f34dfbaa8d82a5e1ef0265e916317161984dIliyan Malchev                                                    &config->channel_mask,
4764113f34dfbaa8d82a5e1ef0265e916317161984dIliyan Malchev                                                    &config->sample_rate,
4774113f34dfbaa8d82a5e1ef0265e916317161984dIliyan Malchev                                                    &status);
4784765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    if (!out->qcom_out) {
4794765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        ret = status;
4804765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        goto err_open;
4814765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    }
4824765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
4834765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    out->stream.common.get_sample_rate = out_get_sample_rate;
4844765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    out->stream.common.set_sample_rate = out_set_sample_rate;
4854765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    out->stream.common.get_buffer_size = out_get_buffer_size;
4864765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    out->stream.common.get_channels = out_get_channels;
4874765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    out->stream.common.get_format = out_get_format;
4884765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    out->stream.common.set_format = out_set_format;
4894765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    out->stream.common.standby = out_standby;
4904765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    out->stream.common.dump = out_dump;
4914765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    out->stream.common.set_parameters = out_set_parameters;
4924765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    out->stream.common.get_parameters = out_get_parameters;
4934765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    out->stream.common.add_audio_effect = out_add_audio_effect;
4944765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    out->stream.common.remove_audio_effect = out_remove_audio_effect;
4954765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    out->stream.get_latency = out_get_latency;
4964765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    out->stream.set_volume = out_set_volume;
4974765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    out->stream.write = out_write;
4984765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    out->stream.get_render_position = out_get_render_position;
4994765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    out->stream.get_next_write_timestamp = out_get_next_write_timestamp;
5004765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
5014765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    *stream_out = &out->stream;
5024765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    return 0;
5034765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
5044765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malcheverr_open:
5054765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    free(out);
5064765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    *stream_out = NULL;
5074765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    return ret;
5084765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev}
5094765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
5104765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevstatic void adev_close_output_stream(struct audio_hw_device *dev,
5114765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev                                     struct audio_stream_out* stream)
5124765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev{
5134765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    struct qcom_audio_device *qadev = to_ladev(dev);
5144765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    struct qcom_stream_out *out = reinterpret_cast<struct qcom_stream_out *>(stream);
5154765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
5164765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    qadev->hwif->closeOutputStream(out->qcom_out);
5174765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    free(out);
5184765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev}
5194765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
5204765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev/** This method creates and opens the audio hardware input stream */
5214765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevstatic int adev_open_input_stream(struct audio_hw_device *dev,
5224765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev                                  audio_io_handle_t handle,
5234765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev                                  audio_devices_t devices,
5244765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev                                  audio_config *config,
5254765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev                                  audio_stream_in **stream_in)
5264765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev{
5274765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    struct qcom_audio_device *qadev = to_ladev(dev);
5284765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    status_t status;
5294765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    struct qcom_stream_in *in;
5304765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    int ret;
5314765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
5324765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    in = (struct qcom_stream_in *)calloc(1, sizeof(*in));
5334765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    if (!in)
5344765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        return -ENOMEM;
5354765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
5364113f34dfbaa8d82a5e1ef0265e916317161984dIliyan Malchev    in->qcom_in = qadev->hwif->openInputStream(devices, (int *)&config->format,
5374113f34dfbaa8d82a5e1ef0265e916317161984dIliyan Malchev                                    &config->channel_mask,
5384113f34dfbaa8d82a5e1ef0265e916317161984dIliyan Malchev                                    &config->sample_rate,
5394113f34dfbaa8d82a5e1ef0265e916317161984dIliyan Malchev                                    &status,
5404113f34dfbaa8d82a5e1ef0265e916317161984dIliyan Malchev                                    (AudioSystem::audio_in_acoustics)0);
5414765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    if (!in->qcom_in) {
5424765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        ret = status;
5434765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        goto err_open;
5444765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    }
5454765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
5464765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    in->stream.common.get_sample_rate = in_get_sample_rate;
5474765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    in->stream.common.set_sample_rate = in_set_sample_rate;
5484765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    in->stream.common.get_buffer_size = in_get_buffer_size;
5494765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    in->stream.common.get_channels = in_get_channels;
5504765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    in->stream.common.get_format = in_get_format;
5514765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    in->stream.common.set_format = in_set_format;
5524765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    in->stream.common.standby = in_standby;
5534765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    in->stream.common.dump = in_dump;
5544765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    in->stream.common.set_parameters = in_set_parameters;
5554765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    in->stream.common.get_parameters = in_get_parameters;
5564765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    in->stream.common.add_audio_effect = in_add_audio_effect;
5574765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    in->stream.common.remove_audio_effect = in_remove_audio_effect;
5584765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    in->stream.set_gain = in_set_gain;
5594765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    in->stream.read = in_read;
5604765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    in->stream.get_input_frames_lost = in_get_input_frames_lost;
5614765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
5624765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    *stream_in = &in->stream;
5634765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    return 0;
5644765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
5654765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malcheverr_open:
5664765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    free(in);
5674765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    *stream_in = NULL;
5684765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    return ret;
5694765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev}
5704765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
5714765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevstatic void adev_close_input_stream(struct audio_hw_device *dev,
5724765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev                               struct audio_stream_in *stream)
5734765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev{
5744765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    struct qcom_audio_device *qadev = to_ladev(dev);
5754765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    struct qcom_stream_in *in =
5764765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        reinterpret_cast<struct qcom_stream_in *>(stream);
5774765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
5784765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    qadev->hwif->closeInputStream(in->qcom_in);
5794765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    free(in);
5804765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev}
5814765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
5824765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevstatic int adev_dump(const struct audio_hw_device *dev, int fd)
5834765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev{
5844765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    const struct qcom_audio_device *qadev = to_cladev(dev);
5854765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    Vector<String16> args;
5864765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
5874765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    return qadev->hwif->dumpState(fd, args);
5884765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev}
5894765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
5904765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevstatic int qcom_adev_close(hw_device_t* device)
5914765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev{
5924765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    struct audio_hw_device *hwdev =
5934765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev                        reinterpret_cast<struct audio_hw_device *>(device);
5944765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    struct qcom_audio_device *qadev = to_ladev(hwdev);
5954765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
5964765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    if (!qadev)
5974765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        return 0;
5984765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
5994765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    if (qadev->hwif)
6004765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        delete qadev->hwif;
6014765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
6024765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    free(qadev);
6034765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    return 0;
6044765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev}
6054765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
6064765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevstatic int qcom_adev_open(const hw_module_t* module, const char* name,
6074765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev                            hw_device_t** device)
6084765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev{
6094765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    struct qcom_audio_device *qadev;
6104765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    int ret;
6114765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
6124765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    if (strcmp(name, AUDIO_HARDWARE_INTERFACE) != 0)
6134765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        return -EINVAL;
6144765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
6154765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    qadev = (struct qcom_audio_device *)calloc(1, sizeof(*qadev));
6164765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    if (!qadev)
6174765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        return -ENOMEM;
6184765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
6194765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    qadev->device.common.tag = HARDWARE_DEVICE_TAG;
6204765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    qadev->device.common.version = AUDIO_DEVICE_API_VERSION_1_0;
6214765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    qadev->device.common.module = const_cast<hw_module_t*>(module);
6224765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    qadev->device.common.close = qcom_adev_close;
6234765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
6244765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    qadev->device.get_supported_devices = adev_get_supported_devices;
6254765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    qadev->device.init_check = adev_init_check;
6264765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    qadev->device.set_voice_volume = adev_set_voice_volume;
6274765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    qadev->device.set_master_volume = adev_set_master_volume;
6284765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    qadev->device.get_master_volume = adev_get_master_volume;
6294765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev#ifdef QUALCOMM_FEATURES_ENABLED
6304765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    qadev->device.set_fm_volume = adev_set_fm_volume;
6314765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev#endif
6324765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    qadev->device.set_mode = adev_set_mode;
6334765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    qadev->device.set_mic_mute = adev_set_mic_mute;
6344765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    qadev->device.get_mic_mute = adev_get_mic_mute;
6354765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    qadev->device.set_parameters = adev_set_parameters;
6364765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    qadev->device.get_parameters = adev_get_parameters;
6374765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    qadev->device.get_input_buffer_size = adev_get_input_buffer_size;
6384765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    qadev->device.open_output_stream = adev_open_output_stream;
6394765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev#ifdef QUALCOMM_FEATURES_ENABLED
6404765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    qadev->device.open_output_session = adev_open_output_session;
6414765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev#endif
6424765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    qadev->device.close_output_stream = adev_close_output_stream;
6434765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    qadev->device.open_input_stream = adev_open_input_stream;
6444765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    qadev->device.close_input_stream = adev_close_input_stream;
6454765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    qadev->device.dump = adev_dump;
6464765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
6474765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    qadev->hwif = createAudioHardware();
6484765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    if (!qadev->hwif) {
6494765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        ret = -EIO;
6504765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        goto err_create_audio_hw;
6514765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    }
6524765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
6534765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    *device = &qadev->device.common;
6544765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
6554765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    return 0;
6564765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
6574765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malcheverr_create_audio_hw:
6584765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    free(qadev);
6594765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    return ret;
6604765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev}
6614765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
6624765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevstatic struct hw_module_methods_t qcom_audio_module_methods = {
6634765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        open: qcom_adev_open
6644765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev};
6654765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
6664765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevstruct qcom_audio_module HAL_MODULE_INFO_SYM = {
6674765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    module: {
6684765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        common: {
6694765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev            tag: HARDWARE_MODULE_TAG,
6704765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev            version_major: 1,
6714765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev            version_minor: 0,
6724765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev            id: AUDIO_HARDWARE_MODULE_ID,
6734765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev            name: "QCOM Audio HW HAL",
6744765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev            author: "Code Aurora Forum",
6754765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev            methods: &qcom_audio_module_methods,
6764765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev            dso : NULL,
6774765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev            reserved : {0},
6784765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        },
6794765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    },
6804765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev};
6814765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
6824765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev}; // extern "C"
6834765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
6844765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev}; // namespace android_audio_legacy
685