119 lines
4.1 KiB
C
119 lines
4.1 KiB
C
|
/*
|
||
|
Copyright (C) 2010 bg <bg_one@mail.ru>
|
||
|
*/
|
||
|
#ifndef CHAN_DONGLE_CPVT_H_INCLUDED
|
||
|
#define CHAN_DONGLE_CPVT_H_INCLUDED
|
||
|
|
||
|
#include "ast_config.h"
|
||
|
|
||
|
#include <asterisk/linkedlists.h> /* AST_LIST_ENTRY() */
|
||
|
#include <asterisk/frame.h> /* AST_FRIENDLY_OFFSET */
|
||
|
|
||
|
#include "export.h" /* EXPORT_DECL EXPORT_DEF */
|
||
|
#include "mixbuffer.h" /* struct mixstream */
|
||
|
#include "mutils.h" /* enum2str() ITEMS_OF() */
|
||
|
|
||
|
#define FRAME_SIZE 320
|
||
|
|
||
|
typedef enum {
|
||
|
CALL_STATE_MIN = 0,
|
||
|
|
||
|
/* values from CLCC */
|
||
|
CALL_STATE_ACTIVE = CALL_STATE_MIN, /*!< comes from CLCC */
|
||
|
CALL_STATE_ONHOLD, /*!< comes from CLCC */
|
||
|
CALL_STATE_DIALING, /*!< comes from CLCC */
|
||
|
CALL_STATE_ALERTING, /*!< comes from CLCC */
|
||
|
CALL_STATE_INCOMING, /*!< comes from CLCC */
|
||
|
CALL_STATE_WAITING, /*!< comes from CLCC */
|
||
|
|
||
|
CALL_STATE_RELEASED, /*!< on CEND or channel_hangup() called */
|
||
|
CALL_STATE_INIT, /*!< channel_call() called */
|
||
|
CALL_STATE_MAX = CALL_STATE_INIT
|
||
|
} call_state_t;
|
||
|
#define CALL_STATES_NUMBER (CALL_STATE_MAX - CALL_STATE_MIN + 1)
|
||
|
|
||
|
typedef enum {
|
||
|
CALL_FLAG_NONE = 0,
|
||
|
CALL_FLAG_HOLD_OTHER = 1, /*!< external, from channel_call() hold other calls and dial this number */
|
||
|
CALL_FLAG_NEED_HANGUP = 2, /*!< internal, require issue AT+CHUP or AT+CHLD=1x for call */
|
||
|
CALL_FLAG_ACTIVATED = 4, /*!< internal, fd attached to channel fds list */
|
||
|
CALL_FLAG_ALIVE = 8, /*!< internal, temporary, still listed in CLCC */
|
||
|
CALL_FLAG_CONFERENCE = 16, /*!< external, from dial() begin conference after activate this call */
|
||
|
CALL_FLAG_MASTER = 32, /*!< internal, channel fd[0] is pvt->audio_fd and fd[1] is timer fd */
|
||
|
CALL_FLAG_BRIDGE_LOOP = 64, /*!< internal, found channel bridged to channel on same device */
|
||
|
CALL_FLAG_BRIDGE_CHECK = 128, /*!< internal, we already do check for bridge loop */
|
||
|
CALL_FLAG_MULTIPARTY = 256, /*!< internal, CLCC mpty is 1 */
|
||
|
} call_flag_t;
|
||
|
|
||
|
|
||
|
/* */
|
||
|
typedef struct cpvt {
|
||
|
AST_LIST_ENTRY (cpvt) entry; /*!< linked list pointers */
|
||
|
|
||
|
struct ast_channel* channel; /*!< Channel pointer */
|
||
|
struct pvt *pvt; /*!< pointer to device structure */
|
||
|
|
||
|
short call_idx; /*!< device call ID */
|
||
|
#define MIN_CALL_IDX 0
|
||
|
#define MAX_CALL_IDX 31
|
||
|
|
||
|
call_state_t state; /*!< see also call_state_t */
|
||
|
int flags; /*!< see also call_flag_t */
|
||
|
|
||
|
/* TODO: join with flags */
|
||
|
unsigned int dir:1; /*!< call direction */
|
||
|
#define CALL_DIR_OUTGOING 0
|
||
|
#define CALL_DIR_INCOMING 1
|
||
|
|
||
|
int rd_pipe[2]; /*!< pipe for split read from device */
|
||
|
#define PIPE_READ 0
|
||
|
#define PIPE_WRITE 1
|
||
|
|
||
|
struct mixstream mixstream; /*!< mix stream */
|
||
|
char a_read_buf[FRAME_SIZE + AST_FRIENDLY_OFFSET];/*!< audio read buffer */
|
||
|
struct ast_frame a_read_frame; /*!< read frame buffer */
|
||
|
|
||
|
// size_t write; /*!< write position in pvt->a_write_buf */
|
||
|
// size_t used; /*!< bytes used in pvt->a_write_buf */
|
||
|
// char a_write_buf[FRAME_SIZE * 5]; /*!< audio write buffer */
|
||
|
// struct ringbuffer a_write_rb; /*!< audio ring buffer */
|
||
|
} cpvt_t;
|
||
|
|
||
|
#define CPVT_SET_FLAGS(cpvt, flag) do { (cpvt)->flags |= (flag); } while(0)
|
||
|
#define CPVT_RESET_FLAGS(cpvt, flag) do { (cpvt)->flags &= ~((int)flag); } while(0)
|
||
|
#define CPVT_TEST_FLAG(cpvt, flag) ((cpvt)->flags & (flag))
|
||
|
#define CPVT_TEST_FLAGS(cpvt, flag) (((cpvt)->flags & (flag)) == (flag))
|
||
|
|
||
|
#define CPVT_IS_MASTER(cpvt) CPVT_TEST_FLAG(cpvt, CALL_FLAG_MASTER)
|
||
|
#define CPVT_IS_ACTIVE(cpvt) ((cpvt)->state == CALL_STATE_ACTIVE)
|
||
|
#define CPVT_IS_SOUND_SOURCE(cpvt) ((cpvt)->state == CALL_STATE_ACTIVE || (cpvt)->state == CALL_STATE_DIALING || (cpvt)->state == CALL_STATE_ALERTING)
|
||
|
|
||
|
|
||
|
EXPORT_DECL struct cpvt * cpvt_alloc(struct pvt * pvt, int call_idx, unsigned dir, call_state_t statem);
|
||
|
EXPORT_DECL void cpvt_free(struct cpvt* cpvt);
|
||
|
|
||
|
EXPORT_DECL struct cpvt * pvt_find_cpvt(struct pvt * pvt, int call_idx);
|
||
|
EXPORT_DECL const char * pvt_call_dir(const struct pvt * pvt);
|
||
|
|
||
|
#/* */
|
||
|
INLINE_DECL const char * call_state2str(call_state_t state)
|
||
|
{
|
||
|
static const char * const states[] = {
|
||
|
/* real device states */
|
||
|
"active",
|
||
|
"held",
|
||
|
"dialing",
|
||
|
"alerting",
|
||
|
"incoming",
|
||
|
"waiting",
|
||
|
|
||
|
/* pseudo states */
|
||
|
"released",
|
||
|
"initialize"
|
||
|
};
|
||
|
|
||
|
return enum2str(state, states, ITEMS_OF(states));
|
||
|
}
|
||
|
|
||
|
#endif /* CHAN_DONGLE_CPVT_H_INCLUDED */
|