/*
 * Copyright (C) 2014 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.
 */

#ifndef ANDROID_MEDIA_AUDIOERRORS_H
#define ANDROID_MEDIA_AUDIOERRORS_H

#include <utils/Errors.h>

namespace android {
// status codes used by JAVA APIs. Translation from native error codes is done by
// nativeToJavaStatus()
// must be kept in sync with values in
// frameworks/base/media/java/android/media/AudioSystem.java.
enum {
    AUDIO_JAVA_SUCCESS            = 0,
    AUDIO_JAVA_ERROR              = -1,
    AUDIO_JAVA_BAD_VALUE          = -2,
    AUDIO_JAVA_INVALID_OPERATION  = -3,
    AUDIO_JAVA_PERMISSION_DENIED  = -4,
    AUDIO_JAVA_NO_INIT            = -5,
    AUDIO_JAVA_DEAD_OBJECT        = -6,
    AUDIO_JAVA_WOULD_BLOCK        = -7,
};

static constexpr inline jint nativeToJavaStatus(status_t status) {
    switch (status) {
    case NO_ERROR:
        return AUDIO_JAVA_SUCCESS;
    case BAD_VALUE:
        return AUDIO_JAVA_BAD_VALUE;
    case INVALID_OPERATION:
        return AUDIO_JAVA_INVALID_OPERATION;
    case PERMISSION_DENIED:
        return AUDIO_JAVA_PERMISSION_DENIED;
    case NO_INIT:
        return AUDIO_JAVA_NO_INIT;
    case WOULD_BLOCK:
        return AUDIO_JAVA_WOULD_BLOCK;
    case DEAD_OBJECT:
        return AUDIO_JAVA_DEAD_OBJECT;
    default:
        return AUDIO_JAVA_ERROR;
    }
}
}; // namespace android
#endif // ANDROID_MEDIA_AUDIOERRORS_H
