doubao_chat/lib/net/libduer-device/modules/voice_engine/lightduer_session.c

100 lines
1.9 KiB
C

// Copyright (2017) Baidu Inc. All rights reserveed.
//
// File: lightduer_session.h
// Auth: Su Hao (suhao@baidu.com)
// Desc: Manage the talk session.
#include "lightduer_session.h"
#include "lightduer_log.h"
#include "lightduer_mutex.h"
#include "lightduer_random.h"
#define DUER_SESSION_START (10000)
#define DUER_SESSION_TATAL (DUER_SESSION_START * 10)
#define DUER_SESSION_INACTIVE (0x80000000)
static duer_u32_t g_session;
static duer_mutex_t g_mutex;
static void local_mutex_lock(duer_bool status)
{
duer_status_t rs;
if (status) {
rs = duer_mutex_lock(g_mutex);
} else {
rs = duer_mutex_unlock(g_mutex);
}
if (rs != DUER_OK) {
DUER_LOGE("lock failed: rs = %d, status = %d", rs, status);
}
}
void duer_session_initialize(void)
{
if (g_mutex == NULL) {
g_mutex = duer_mutex_create();
}
local_mutex_lock(DUER_TRUE);
g_session = DUER_SESSION_START + (duer_u32_t)duer_random() % DUER_SESSION_TATAL;
DUER_LOGI("random = %d", g_session);
local_mutex_lock(DUER_FALSE);
}
duer_u32_t duer_session_generate(void)
{
duer_u32_t rs;
local_mutex_lock(DUER_TRUE);
g_session &= (~DUER_SESSION_INACTIVE);
rs = ++g_session;
local_mutex_lock(DUER_FALSE);
return rs;
}
duer_bool duer_session_consume(duer_u32_t id)
{
duer_bool rs = DUER_FALSE;
local_mutex_lock(DUER_TRUE);
if (id == g_session) {
g_session |= DUER_SESSION_INACTIVE;
rs = DUER_TRUE;
}
local_mutex_lock(DUER_FALSE);
return rs;
}
duer_bool duer_session_is_matched(duer_u32_t id)
{
duer_bool rs;
local_mutex_lock(DUER_TRUE);
rs = (g_session == id) ? DUER_TRUE : DUER_FALSE;
local_mutex_lock(DUER_FALSE);
return rs;
}
void duer_session_finalize(void)
{
if (g_mutex != NULL) {
duer_mutex_destroy(g_mutex);
g_mutex = NULL;
}
}