mirror of
https://github.com/n5ac/smartsdr-dsp.git
synced 2026-01-17 05:50:02 +01:00
Add lists for encoded/decoded frames. Link into correct chain from process serial
This commit is contained in:
parent
3158f09387
commit
d618652579
|
|
@ -74,17 +74,24 @@
|
|||
static pthread_t _read_thread;
|
||||
BOOL _readThreadAbort = FALSE;
|
||||
|
||||
static uint32 _buffering_target = 10;
|
||||
|
||||
static pthread_rwlock_t _encoded_list_lock;
|
||||
static BufferDescriptor _encoded_root;
|
||||
static BOOL _encoded_buffering = TRUE;
|
||||
static uint32 _encoded_count = 0;
|
||||
|
||||
static pthread_rwlock_t _decoded_list_lock;
|
||||
static BufferDescriptor _decoded_root;
|
||||
static BOOL _decoded_buffering = TRUE;
|
||||
static uint32 _decoded_count = 0;
|
||||
|
||||
static BufferDescriptor _thumbDVEncodedList_UnlinkHead(void)
|
||||
{
|
||||
BufferDescriptor buf_desc = NULL;
|
||||
pthread_rwlock_wrlock(&_encoded_list_lock);
|
||||
|
||||
|
||||
if (_encoded_root == NULL || _encoded_root->next == NULL)
|
||||
{
|
||||
output("Attempt to unlink from a NULL head");
|
||||
|
|
@ -92,6 +99,11 @@ static BufferDescriptor _thumbDVEncodedList_UnlinkHead(void)
|
|||
return NULL;
|
||||
}
|
||||
|
||||
if ( _encoded_buffering ) {
|
||||
pthread_rwlock_unlock(&_encoded_list_lock);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if(_encoded_root->next != _encoded_root)
|
||||
buf_desc = _encoded_root->next;
|
||||
|
||||
|
|
@ -109,7 +121,11 @@ static BufferDescriptor _thumbDVEncodedList_UnlinkHead(void)
|
|||
buf_desc->prev->next = buf_desc->next;
|
||||
buf_desc->next = NULL;
|
||||
buf_desc->prev = NULL;
|
||||
if ( _encoded_count > 0 ) _encoded_count--;
|
||||
}
|
||||
} else {
|
||||
if ( !_encoded_buffering ) output("Encoded list now buffering\n");
|
||||
_encoded_buffering = TRUE;
|
||||
}
|
||||
|
||||
pthread_rwlock_unlock(&_encoded_list_lock);
|
||||
|
|
@ -123,6 +139,13 @@ static void _thumbDVEncodedList_LinkTail(BufferDescriptor buf_desc)
|
|||
buf_desc->prev = _encoded_root->prev;
|
||||
_encoded_root->prev->next = buf_desc;
|
||||
_encoded_root->prev = buf_desc;
|
||||
_encoded_count++;
|
||||
|
||||
if ( _encoded_count > _buffering_target ) {
|
||||
if ( _encoded_buffering ) output("Encoded Buffering is now FALSE\n");
|
||||
_encoded_buffering = FALSE;
|
||||
}
|
||||
|
||||
pthread_rwlock_unlock(&_encoded_list_lock);
|
||||
}
|
||||
|
||||
|
|
@ -138,6 +161,11 @@ static BufferDescriptor _thumbDVDecodedList_UnlinkHead(void)
|
|||
return NULL;
|
||||
}
|
||||
|
||||
if ( _decoded_buffering ) {
|
||||
pthread_rwlock_unlock(&_decoded_list_lock);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if(_decoded_root->next != _decoded_root)
|
||||
buf_desc = _decoded_root->next;
|
||||
|
||||
|
|
@ -155,7 +183,11 @@ static BufferDescriptor _thumbDVDecodedList_UnlinkHead(void)
|
|||
buf_desc->prev->next = buf_desc->next;
|
||||
buf_desc->next = NULL;
|
||||
buf_desc->prev = NULL;
|
||||
if ( _decoded_count > 0 ) _decoded_count--;
|
||||
}
|
||||
} else {
|
||||
if ( !_decoded_buffering ) output("DecodedList now Buffering \n");
|
||||
_decoded_buffering = TRUE;
|
||||
}
|
||||
|
||||
pthread_rwlock_unlock(&_decoded_list_lock);
|
||||
|
|
@ -169,6 +201,13 @@ static void _thumbDVDecodedList_LinkTail(BufferDescriptor buf_desc)
|
|||
buf_desc->prev = _decoded_root->prev;
|
||||
_decoded_root->prev->next = buf_desc;
|
||||
_decoded_root->prev = buf_desc;
|
||||
|
||||
_decoded_count++;
|
||||
if ( _decoded_count > _buffering_target ) {
|
||||
if ( _decoded_buffering ) output("Decoded Buffering is now FALSE\n");
|
||||
_decoded_buffering = FALSE;
|
||||
}
|
||||
|
||||
pthread_rwlock_unlock(&_decoded_list_lock);
|
||||
}
|
||||
|
||||
|
|
@ -337,17 +376,20 @@ int thumbDV_processSerial(int serial_fd)
|
|||
|
||||
BufferDescriptor desc = NULL;
|
||||
packet_type = buffer[3];
|
||||
dump("Serial data", buffer, respLen);
|
||||
//dump("Serial data", buffer, respLen);
|
||||
if ( packet_type == AMBE3000_CTRL_PKT_TYPE ) {
|
||||
// dump("Serial data", buffer, respLen);
|
||||
dump("Serial data", buffer, respLen);
|
||||
} else if ( packet_type == AMBE3000_CHAN_PKT_TYPE ) {
|
||||
desc = hal_BufferRequest(respLen, sizeof(unsigned char) );
|
||||
memcpy(desc->buf_ptr, buffer, respLen);
|
||||
dump("Coded Packet", buffer, respLen);
|
||||
/* Encoded data */
|
||||
_thumbDVEncodedList_LinkTail(desc);
|
||||
} else if ( packet_type == AMBE3000_SPEECH_PKT_TYPE ) {
|
||||
output("s");
|
||||
desc = hal_BufferRequest(respLen, sizeof(unsigned char));
|
||||
memcpy(desc->buf_ptr, buffer, respLen);
|
||||
dump("SPEECH Packet", buffer, respLen);
|
||||
/* Speech data */
|
||||
_thumbDVDecodedList_LinkTail(desc);
|
||||
|
||||
|
|
@ -362,39 +404,49 @@ int thumbDV_processSerial(int serial_fd)
|
|||
|
||||
int thumbDV_decode(int serial_fd, unsigned char * packet_in, short * speech_out, uint8 bytes_in_packet)
|
||||
{
|
||||
//
|
||||
// unsigned char * idx = &packet_in[0];
|
||||
//
|
||||
// if ( *idx != AMBE3000_START_BYTE ) {
|
||||
// output(ANSI_RED "packet_in does not have valid start byte\n" ANSI_WHITE);
|
||||
// return -1;
|
||||
// }
|
||||
// idx++;
|
||||
//
|
||||
// uint16 length = ( *idx << 8 ) + ( *(idx+1) );
|
||||
// //output("Packet length decode is 0x%02X", length);
|
||||
//
|
||||
// if ( length != (bytes_in_packet - AMBE3000_HEADER_LEN)) {
|
||||
// output("Mismatched length %d expected %d\n", length, bytes_in_packet - AMBE3000_HEADER_LEN );
|
||||
// }
|
||||
//
|
||||
// idx += 2;
|
||||
//
|
||||
// if ( *idx != AMBE3000_CHAN_PKT_TYPE ) {
|
||||
// output(ANSI_RED "Invalid packet type for decode 0x%02X\n", *idx);
|
||||
// return -1;
|
||||
// }
|
||||
//
|
||||
// idx++;
|
||||
//
|
||||
// thumbDV_writeSerial(serial_fd, packet_in, bytes_in_packet);
|
||||
|
||||
unsigned char * idx = &packet_in[0];
|
||||
BufferDescriptor desc2 = _thumbDVEncodedList_UnlinkHead();
|
||||
|
||||
if ( *idx != AMBE3000_START_BYTE ) {
|
||||
output(ANSI_RED "packet_in does not have valid start byte\n" ANSI_WHITE);
|
||||
return -1;
|
||||
if ( desc2 != NULL ) {
|
||||
thumbDV_writeSerial(serial_fd, desc2->buf_ptr, desc2->num_samples * desc2->sample_size);
|
||||
}
|
||||
idx++;
|
||||
|
||||
uint16 length = ( *idx << 8 ) + ( *(idx+1) );
|
||||
//output("Packet length decode is 0x%02X", length);
|
||||
|
||||
if ( length != (bytes_in_packet - AMBE3000_HEADER_LEN)) {
|
||||
output("Mismatched length %d expected %d\n", length, bytes_in_packet - AMBE3000_HEADER_LEN );
|
||||
}
|
||||
|
||||
idx += 2;
|
||||
|
||||
if ( *idx != AMBE3000_CHAN_PKT_TYPE ) {
|
||||
output(ANSI_RED "Invalid packet type for decode 0x%02X\n", *idx);
|
||||
return -1;
|
||||
}
|
||||
|
||||
idx++;
|
||||
|
||||
thumbDV_writeSerial(serial_fd, packet_in, bytes_in_packet);
|
||||
|
||||
int32 samples_returned = 0;
|
||||
BufferDescriptor desc = _thumbDVDecodedList_UnlinkHead();
|
||||
BufferDescriptor desc = NULL;//_thumbDVDecodedList_UnlinkHead();
|
||||
uint32 samples_in_speech_packet = 0;
|
||||
|
||||
if ( desc != NULL ) {
|
||||
memcpy(speech_out, desc->buf_ptr, desc->sample_size * desc->num_samples);
|
||||
samples_returned = desc->num_samples;
|
||||
samples_in_speech_packet = ((unsigned char * )desc->buf_ptr)[5];
|
||||
|
||||
memcpy(speech_out, desc->buf_ptr + AMBE3000_HEADER_LEN + AMBE3000_SPEECHD_HEADER_LEN - 1, sizeof(uint16) * samples_in_speech_packet);
|
||||
samples_returned = samples_in_speech_packet;
|
||||
if ( samples_returned != 160 ) output("Rate Mismatch expected %d got %d\n", 160, samples_returned);
|
||||
safe_free(desc);
|
||||
} else {
|
||||
/* Do nothing for now */
|
||||
|
|
@ -408,8 +460,6 @@ int thumbDV_encode(int serial_fd, short * speech_in, unsigned char * packet_out,
|
|||
unsigned char packet[THUMBDV_MAX_PACKET_LEN];
|
||||
uint16 speech_d_bytes = num_of_samples * sizeof(uint16); /* Should be 2 times the number of samples */
|
||||
|
||||
|
||||
|
||||
/* Calculate length of packet NOT including the full header just the type field*/
|
||||
uint16 length = 1;
|
||||
/* Includes Channel Field and SpeechD Field Header */
|
||||
|
|
@ -453,12 +503,11 @@ int thumbDV_encode(int serial_fd, short * speech_in, unsigned char * packet_out,
|
|||
thumbDV_writeSerial(serial_fd, packet, length + 3);
|
||||
|
||||
int32 samples_returned = 0;
|
||||
BufferDescriptor desc = _thumbDVEncodedList_UnlinkHead();
|
||||
BufferDescriptor desc = NULL ;//_thumbDVEncodedList_UnlinkHead();
|
||||
|
||||
if ( desc != NULL ) {
|
||||
memcpy(packet_out, desc->buf_ptr, desc->sample_size * desc->num_samples);
|
||||
samples_returned = desc->num_samples;
|
||||
if ( samples_returned != num_of_samples ) output("Rate Mismatch expected %d got %d\n", num_of_samples, samples_returned);
|
||||
safe_free(desc);
|
||||
} else {
|
||||
/* Do nothing for now */
|
||||
|
|
@ -556,7 +605,12 @@ void thumbDV_init(const char * serial_device_name, int * serial_fd)
|
|||
thumbDV_writeSerial(*serial_fd, get_prodID, 5 );
|
||||
thumbDV_writeSerial(*serial_fd, get_version, 5);
|
||||
thumbDV_writeSerial(*serial_fd, read_cfg, 5);
|
||||
|
||||
thumbDV_writeSerial(*serial_fd, dstar_mode, 17);
|
||||
|
||||
|
||||
unsigned char test_coded[15] = {0x61, 0x00 ,0x0B ,0x01 ,0x01 ,0x48 ,0x5E ,0x83 ,0x12 ,0x3B ,0x98 ,0x79 ,0xDE ,0x13 ,0x90};
|
||||
|
||||
thumbDV_writeSerial(*serial_fd, test_coded, 15);
|
||||
|
||||
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in a new issue