Home | History | Annotate | Download | only in libmedia
      1 /*
      2  * Copyright (C) 2014 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 #define LOG_TAG "AudioPolicy"
     18 //#define LOG_NDEBUG 0
     19 #include <utils/Log.h>
     20 #include <media/AudioPolicy.h>
     21 
     22 namespace android {
     23 
     24 //
     25 //  AudioMixMatchCriterion implementation
     26 //
     27 AudioMixMatchCriterion::AudioMixMatchCriterion(audio_usage_t usage,
     28                                                  audio_source_t source,
     29                                                  uint32_t rule)
     30 : mRule(rule)
     31 {
     32     if (mRule == RULE_MATCH_ATTRIBUTE_USAGE ||
     33             mRule == RULE_EXCLUDE_ATTRIBUTE_USAGE) {
     34         mValue.mUsage = usage;
     35     } else {
     36         mValue.mSource = source;
     37     }
     38 }
     39 
     40 status_t AudioMixMatchCriterion::readFromParcel(Parcel *parcel)
     41 {
     42     mRule = parcel->readInt32();
     43     if (mRule == RULE_MATCH_ATTRIBUTE_USAGE ||
     44             mRule == RULE_EXCLUDE_ATTRIBUTE_USAGE) {
     45         mValue.mUsage = (audio_usage_t)parcel->readInt32();
     46     } else {
     47         mValue.mSource = (audio_source_t)parcel->readInt32();
     48     }
     49     return NO_ERROR;
     50 }
     51 
     52 status_t AudioMixMatchCriterion::writeToParcel(Parcel *parcel) const
     53 {
     54     parcel->writeInt32(mRule);
     55     parcel->writeInt32(mValue.mUsage);
     56     return NO_ERROR;
     57 }
     58 
     59 //
     60 //  AudioMix implementation
     61 //
     62 
     63 status_t AudioMix::readFromParcel(Parcel *parcel)
     64 {
     65     mMixType = parcel->readInt32();
     66     mFormat.sample_rate = (uint32_t)parcel->readInt32();
     67     mFormat.channel_mask = (audio_channel_mask_t)parcel->readInt32();
     68     mFormat.format = (audio_format_t)parcel->readInt32();
     69     mRouteFlags = parcel->readInt32();
     70     mDeviceType = (audio_devices_t) parcel->readInt32();
     71     mDeviceAddress = parcel->readString8();
     72     mCbFlags = (uint32_t)parcel->readInt32();
     73     size_t size = (size_t)parcel->readInt32();
     74     if (size > MAX_CRITERIA_PER_MIX) {
     75         size = MAX_CRITERIA_PER_MIX;
     76     }
     77     for (size_t i = 0; i < size; i++) {
     78         AudioMixMatchCriterion criterion;
     79         if (criterion.readFromParcel(parcel) == NO_ERROR) {
     80             mCriteria.add(criterion);
     81         }
     82     }
     83     return NO_ERROR;
     84 }
     85 
     86 status_t AudioMix::writeToParcel(Parcel *parcel) const
     87 {
     88     parcel->writeInt32(mMixType);
     89     parcel->writeInt32(mFormat.sample_rate);
     90     parcel->writeInt32(mFormat.channel_mask);
     91     parcel->writeInt32(mFormat.format);
     92     parcel->writeInt32(mRouteFlags);
     93     parcel->writeInt32(mDeviceType);
     94     parcel->writeString8(mDeviceAddress);
     95     parcel->writeInt32(mCbFlags);
     96     size_t size = mCriteria.size();
     97     if (size > MAX_CRITERIA_PER_MIX) {
     98         size = MAX_CRITERIA_PER_MIX;
     99     }
    100     size_t sizePosition = parcel->dataPosition();
    101     parcel->writeInt32(size);
    102     size_t finalSize = size;
    103     for (size_t i = 0; i < size; i++) {
    104         size_t position = parcel->dataPosition();
    105         if (mCriteria[i].writeToParcel(parcel) != NO_ERROR) {
    106             parcel->setDataPosition(position);
    107             finalSize--;
    108         }
    109     }
    110     if (size != finalSize) {
    111         size_t position = parcel->dataPosition();
    112         parcel->setDataPosition(sizePosition);
    113         parcel->writeInt32(finalSize);
    114         parcel->setDataPosition(position);
    115     }
    116     return NO_ERROR;
    117 }
    118 
    119 } // namespace android
    120