You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
206 lines
5.6 KiB
Go
206 lines
5.6 KiB
Go
3 years ago
|
package recorddata
|
||
|
|
||
|
import (
|
||
|
"encoding/binary"
|
||
|
"fmt"
|
||
|
|
||
|
"gitlab.com/ics_cinnamon/voicegateway/icserror"
|
||
|
"gitlab.com/ics_cinnamon/voicegateway/icslog"
|
||
|
"gitlab.com/ics_cinnamon/voicegateway/icspacketparser"
|
||
|
)
|
||
|
|
||
|
type VoiceData struct {
|
||
|
stream []byte
|
||
|
}
|
||
|
|
||
|
type VoiceDataHDR struct {
|
||
|
ServerID int
|
||
|
CreateTime int64
|
||
|
Station int
|
||
|
Seq int
|
||
|
Type byte
|
||
|
Codec string
|
||
|
Payload []byte
|
||
|
}
|
||
|
|
||
|
const (
|
||
|
VOICE_DATA_LEN = 340
|
||
|
|
||
|
vcSERVERID_POS = 0
|
||
|
vcSERVERID_LEN = 2
|
||
|
vcCREATETIME_POS = vcSERVERID_POS + 2
|
||
|
vcCREATETIME_LEN = vcCREATETIME_POS + 8
|
||
|
vcSTATION_POS = vcCREATETIME_POS + 8
|
||
|
vcSTATION_LEN = vcSTATION_POS + 4
|
||
|
vcSEQUENCE_POS = vcSTATION_POS + 4
|
||
|
vcSEQUENCE_LEN = vcSEQUENCE_POS + 4
|
||
|
vcTYPE_POS = vcSEQUENCE_POS + 4
|
||
|
vcTYPE_LEN = vcTYPE_POS + 1
|
||
|
vcCODEC_POS = vcTYPE_POS + 1
|
||
|
vcCODEC_LEN = vcCODEC_POS + 1
|
||
|
vcPAYLOAD_POS = vcCODEC_POS + 1
|
||
|
vcPAYLOAD_LEN = vcPAYLOAD_POS + 320
|
||
|
)
|
||
|
|
||
|
func NewVoiceData() *VoiceData {
|
||
|
v := &VoiceData{
|
||
|
stream: make([]byte, VOICE_DATA_LEN),
|
||
|
}
|
||
|
|
||
|
return v
|
||
|
}
|
||
|
|
||
|
func NewVoiceDataHDR(voicedata []byte) *VoiceDataHDR {
|
||
|
hdr := VoiceDataHDR{}
|
||
|
hdr.parse(voicedata)
|
||
|
|
||
|
return &hdr
|
||
|
}
|
||
|
|
||
|
func (hdr *VoiceDataHDR) parse(data []byte) {
|
||
|
defer func() {
|
||
|
if err := recover(); err != nil {
|
||
|
l := icslog.GetIcsLog()
|
||
|
l.Print(icslog.LOG_LEVEL_WARN, -1, icserror.ICSERRRECORDDATAParsing.GetMessage())
|
||
|
}
|
||
|
}()
|
||
|
|
||
|
hdr.ServerID = int(binary.LittleEndian.Uint16(data[vcSEQUENCE_POS:vcSEQUENCE_LEN]))
|
||
|
hdr.CreateTime = int64(binary.LittleEndian.Uint64(data[vcCREATETIME_POS:vcCREATETIME_LEN]))
|
||
|
hdr.Station = int(binary.LittleEndian.Uint32(data[vcSTATION_POS:vcSTATION_LEN]))
|
||
|
hdr.Seq = int(binary.LittleEndian.Uint32(data[vcSEQUENCE_POS:vcSEQUENCE_LEN]))
|
||
|
hdr.Type = data[vcTYPE_POS:vcTYPE_LEN][0]
|
||
|
hdr.Codec = fmt.Sprintf("%d", data[vcCODEC_POS:vcCODEC_LEN])
|
||
|
hdr.Payload = data[vcPAYLOAD_POS:vcPAYLOAD_LEN]
|
||
|
}
|
||
|
|
||
|
func (v *VoiceData) SetData(serverID int, station string, sequence int32, timestamp int64, calltype string, codec icspacketparser.PayloadType, payload []byte) {
|
||
|
v.setServerID(serverID)
|
||
|
v.setCreateTime(timestamp)
|
||
|
v.setStation(station)
|
||
|
v.setSequence(sequence)
|
||
|
v.setType(calltype)
|
||
|
v.setCodec2(codec)
|
||
|
//v.setCodec(codec)
|
||
|
v.setPayload(payload)
|
||
|
}
|
||
|
|
||
|
func (v VoiceData) GetData() []byte {
|
||
|
return v.stream
|
||
|
}
|
||
|
|
||
|
func (v *VoiceData) setServerID(serverID int) {
|
||
|
id := fmt.Sprintf("%d", serverID)
|
||
|
tmp := []byte(id)
|
||
|
copy(v.stream[vcSERVERID_POS:vcSERVERID_LEN], tmp)
|
||
|
|
||
|
//l := icslog.GetIcsLog()
|
||
|
//l.Printf(icslog.LOG_LEVEL_DEBUG2, -1, "setServerID> %d-%v", len(v.stream[vcSERVERID_POS:vcSERVERID_LEN]), v)
|
||
|
}
|
||
|
|
||
|
func (v *VoiceData) setCreateTime(createtime int64) {
|
||
|
tmp := make([]byte, 8)
|
||
|
binary.LittleEndian.PutUint64(tmp, uint64(createtime))
|
||
|
copy(v.stream[vcCREATETIME_POS:vcCREATETIME_LEN], tmp)
|
||
|
|
||
|
//l := icslog.GetIcsLog()
|
||
|
//l.Printf(icslog.LOG_LEVEL_DEBUG2, -1, "setCreateTime> %d-%v", len(v.stream[vcCREATETIME_POS:vcCREATETIME_LEN]), v)
|
||
|
}
|
||
|
|
||
|
func (v *VoiceData) setStation(station string) {
|
||
|
//tmp := make([]byte, 4)
|
||
|
//binary.LittleEndian.PutUint32(tmp, uint32(station))
|
||
|
copy(v.stream[vcSTATION_POS:vcSTATION_LEN], []byte(station))
|
||
|
|
||
|
//l := icslog.GetIcsLog()
|
||
|
//l.Printf(icslog.LOG_LEVEL_DEBUG2, -1, "setStation> %d-%v", len(v.stream[vcSTATION_POS:vcSTATION_LEN]), v)
|
||
|
}
|
||
|
|
||
|
func (v *VoiceData) setSequence(sequence int32) {
|
||
|
tmp := make([]byte, 4)
|
||
|
binary.LittleEndian.PutUint32(tmp, uint32(sequence))
|
||
|
copy(v.stream[vcSEQUENCE_POS:vcSEQUENCE_LEN], tmp)
|
||
|
|
||
|
//l := icslog.GetIcsLog()
|
||
|
//l.Printf(icslog.LOG_LEVEL_DEBUG2, -1, "setSequence> %d-%v", len(v.stream[vcSEQUENCE_POS:vcSEQUENCE_LEN]), v)
|
||
|
}
|
||
|
|
||
|
func (v *VoiceData) setType(calltype string) {
|
||
|
tmp := make([]byte, 4)
|
||
|
if calltype == "0" {
|
||
|
binary.LittleEndian.PutUint32(tmp, uint32(0))
|
||
|
} else {
|
||
|
binary.LittleEndian.PutUint32(tmp, uint32(1))
|
||
|
}
|
||
|
|
||
|
copy(v.stream[vcTYPE_POS:vcTYPE_LEN], tmp)
|
||
|
|
||
|
//l := icslog.GetIcsLog()
|
||
|
//l.Printf(icslog.LOG_LEVEL_DEBUG2, -1, "setType> %d-%v", len(v.stream[vcTYPE_POS:vcTYPE_LEN]), v)
|
||
|
}
|
||
|
|
||
|
func (v *VoiceData) setCodec(codec string) {
|
||
|
tmp := make([]byte, 4)
|
||
|
if codec == "0" {
|
||
|
binary.LittleEndian.PutUint32(tmp, uint32(0))
|
||
|
} else if codec == "8" {
|
||
|
binary.LittleEndian.PutUint32(tmp, uint32(8))
|
||
|
} else if codec == "18" {
|
||
|
binary.LittleEndian.PutUint32(tmp, uint32(18))
|
||
|
}
|
||
|
copy(v.stream[vcCODEC_POS:vcCODEC_LEN], tmp)
|
||
|
|
||
|
//l := icslog.GetIcsLog()
|
||
|
//l.Printf(icslog.LOG_LEVEL_DEBUG2, -1, "setCodec> %d-%v", len(v.stream[vcCODEC_POS:vcCODEC_LEN]), v)
|
||
|
}
|
||
|
|
||
|
func (v *VoiceData) setCodec2(codec icspacketparser.PayloadType) {
|
||
|
tmp := make([]byte, 4)
|
||
|
if codec == 0 {
|
||
|
binary.LittleEndian.PutUint32(tmp, uint32(0))
|
||
|
} else if codec == 8 {
|
||
|
binary.LittleEndian.PutUint32(tmp, uint32(8))
|
||
|
} else if codec == 18 {
|
||
|
binary.LittleEndian.PutUint32(tmp, uint32(18))
|
||
|
}
|
||
|
copy(v.stream[vcCODEC_POS:vcCODEC_LEN], tmp)
|
||
|
|
||
|
//l := icslog.GetIcsLog()
|
||
|
//l.Printf(icslog.LOG_LEVEL_DEBUG2, -1, "setCodec> %d-%v", len(v.stream[vcCODEC_POS:vcCODEC_LEN]), v)
|
||
|
}
|
||
|
|
||
|
func (v *VoiceData) setPayload(payload []byte) {
|
||
|
copy(v.stream[vcPAYLOAD_POS:vcPAYLOAD_LEN], payload)
|
||
|
|
||
|
//l := icslog.GetIcsLog()
|
||
|
//l.Printf(icslog.LOG_LEVEL_DEBUG2, -1, "setPayload> %d-%v", len(v.stream[vcPAYLOAD_POS:vcPAYLOAD_LEN]), v)
|
||
|
}
|
||
|
|
||
|
func (v VoiceData) GetServerID() []byte {
|
||
|
return v.stream[vcSERVERID_POS:vcSERVERID_LEN]
|
||
|
}
|
||
|
|
||
|
func (v VoiceData) GetCreateTime() []byte {
|
||
|
return v.stream[vcCREATETIME_POS:vcCREATETIME_LEN]
|
||
|
}
|
||
|
|
||
|
func (v VoiceData) GetStation() []byte {
|
||
|
return v.stream[vcSTATION_POS:vcSTATION_LEN]
|
||
|
}
|
||
|
|
||
|
func (v VoiceData) GetSequence() []byte {
|
||
|
return v.stream[vcSEQUENCE_POS:vcSEQUENCE_LEN]
|
||
|
}
|
||
|
|
||
|
func (v VoiceData) GetType() []byte {
|
||
|
return v.stream[vcTYPE_POS:vcTYPE_LEN]
|
||
|
}
|
||
|
|
||
|
func (v VoiceData) GetCodec() []byte {
|
||
|
return v.stream[vcCODEC_POS:vcCODEC_LEN]
|
||
|
}
|
||
|
|
||
|
func (v VoiceData) GetPayload() []byte {
|
||
|
return v.stream[vcPAYLOAD_POS:vcPAYLOAD_LEN]
|
||
|
}
|