doubao_chat/apps/common/example/audio/lc3/main.c

532 lines
23 KiB
C

#include "app_config.h"
#include "system/includes.h"
#include "audio_server.h"
#ifdef USE_LC3_TEST
static const u8 data_44100_16[882] = {
0xFF, 0xFF, 0x2F, 0x12, 0xF9, 0x23, 0x12, 0x35, 0x0D, 0x45, 0xAC, 0x53, 0x93, 0x60, 0x84, 0x6B,
0x4F, 0x74, 0xB2, 0x7A, 0xA6, 0x7E, 0xFD, 0x7F, 0xC7, 0x7E, 0xF5, 0x7A, 0xB0, 0x74, 0xFF, 0x6B,
0x2F, 0x61, 0x58, 0x54, 0xD6, 0x45, 0xE3, 0x35, 0xD9, 0x24, 0x18, 0x13, 0xE4, 0x00, 0xC2, 0xEE,
0xDC, 0xDC, 0xCC, 0xCB, 0xB1, 0xBB, 0x09, 0xAD, 0x08, 0xA0, 0xF6, 0x94, 0x1C, 0x8C, 0x87, 0x85,
0x86, 0x81, 0x03, 0x80, 0x1E, 0x81, 0xC8, 0x84, 0xF4, 0x8A, 0x80, 0x93, 0x3F, 0x9E, 0xF5, 0xAA,
0x69, 0xB9, 0x49, 0xC9, 0x45, 0xDA, 0x06, 0xEC, 0x2D, 0xFE, 0x5E, 0x10, 0x3C, 0x22, 0x62, 0x33,
0x88, 0x43, 0x45, 0x52, 0x5F, 0x5F, 0x85, 0x6A, 0x87, 0x73, 0x2B, 0x7A, 0x5F, 0x7E, 0xF8, 0x7F,
0x05, 0x7F, 0x73, 0x7B, 0x6B, 0x75, 0xFA, 0x6C, 0x5A, 0x62, 0xB7, 0x55, 0x59, 0x47, 0x8C, 0x37,
0x97, 0x26, 0xE1, 0x14, 0xBE, 0x02, 0x86, 0xF0, 0xAC, 0xDE, 0x6C, 0xCD, 0x44, 0xBD, 0x6C, 0xAE,
0x3E, 0xA1, 0xFE, 0x95, 0xDD, 0x8C, 0x1C, 0x86, 0xC7, 0x81, 0x0E, 0x80, 0xDD, 0x80, 0x52, 0x84,
0x39, 0x8A, 0x8A, 0x92, 0x15, 0x9D, 0x99, 0xA9, 0xE5, 0xB7, 0xA8, 0xC7, 0x83, 0xD8, 0x3F, 0xEA,
0x56, 0xFC, 0x91, 0x0E, 0x76, 0x20, 0xBA, 0x31, 0xF4, 0x41, 0xE2, 0x50, 0x23, 0x5E, 0x80, 0x69,
0xB9, 0x72, 0xA0, 0x79, 0x0C, 0x7E, 0xF2, 0x7F, 0x36, 0x7F, 0xEF, 0x7B, 0x20, 0x76, 0xEE, 0x6D,
0x7F, 0x63, 0x13, 0x57, 0xD7, 0x48, 0x31, 0x39, 0x52, 0x28, 0xB0, 0x16, 0x8C, 0x04, 0x5B, 0xF2,
0x69, 0xE0, 0x20, 0xCF, 0xD1, 0xBE, 0xD8, 0xAF, 0x77, 0xA2, 0x09, 0x97, 0xAB, 0x8D, 0xAC, 0x86,
0x1C, 0x82, 0x17, 0x80, 0xB1, 0x80, 0xD7, 0x83, 0x87, 0x89, 0x9D, 0x91, 0xEA, 0x9B, 0x49, 0xA8,
0x63, 0xB6, 0x04, 0xC6, 0xCD, 0xD6, 0x6E, 0xE8, 0x86, 0xFA, 0xC2, 0x0C, 0xAF, 0x1E, 0x0D, 0x30,
0x61, 0x40, 0x76, 0x4F, 0xE4, 0x5C, 0x75, 0x68, 0xE8, 0x71, 0x09, 0x79, 0xBC, 0x7D, 0xDA, 0x7F,
0x6B, 0x7F, 0x5E, 0x7C, 0xD0, 0x76, 0xDD, 0x6E, 0xA0, 0x64, 0x66, 0x58, 0x59, 0x4A, 0xCA, 0x3A,
0x14, 0x2A, 0x75, 0x18, 0x63, 0x06, 0x28, 0xF4, 0x30, 0xE2, 0xD0, 0xD0, 0x67, 0xC0, 0x41, 0xB1,
0xBF, 0xA3, 0x10, 0x98, 0x86, 0x8E, 0x42, 0x87, 0x72, 0x82, 0x2E, 0x80, 0x82, 0x80, 0x6C, 0x83,
0xD8, 0x88, 0xB3, 0x90, 0xCB, 0x9A, 0xF4, 0xA6, 0xEB, 0xB4, 0x62, 0xC4, 0x17, 0xD5, 0xA0, 0xE6,
0xB7, 0xF8, 0xEF, 0x0A, 0xEB, 0x1C, 0x58, 0x2E, 0xCF, 0x3E, 0x04, 0x4E, 0xA0, 0x5B, 0x67, 0x67,
0x0D, 0x71, 0x70, 0x78, 0x61, 0x7D, 0xBF, 0x7F, 0x97, 0x7F, 0xC8, 0x7C, 0x7C, 0x77, 0xC0, 0x6F,
0xC2, 0x65, 0xB3, 0x59, 0xD4, 0x4B, 0x69, 0x3C, 0xC8, 0x2B, 0x41, 0x1A, 0x34, 0x08, 0xFC, 0xF5,
0xF4, 0xE3, 0x86, 0xD2, 0xF9, 0xC1, 0xB9, 0xB2, 0x00, 0xA5, 0x27, 0x99, 0x5E, 0x8F, 0xE0, 0x87,
0xD2, 0x82, 0x4A, 0x80, 0x5D, 0x80, 0xFF, 0x82, 0x37, 0x88, 0xC9, 0x8F, 0xB5, 0x99, 0xA5, 0xA5,
0x71, 0xB3, 0xCB, 0xC2, 0x5A, 0xD3, 0xDD, 0xE4, 0xE3, 0xF6, 0x1B, 0x09, 0x29, 0x1B, 0x9D, 0x2C,
0x3C, 0x3D, 0x8E, 0x4C, 0x57, 0x5A, 0x53, 0x66, 0x2C, 0x70, 0xD3, 0x77, 0xFB, 0x7C, 0xA4, 0x7F,
0xB7, 0x7F, 0x2D, 0x7D, 0x21, 0x78, 0xA2, 0x70, 0xD7, 0x66, 0x01, 0x5B, 0x47, 0x4D, 0x05, 0x3E,
0x7F, 0x2D, 0x06, 0x1C, 0x08, 0x0A, 0xCB, 0xF7, 0xBE, 0xE5, 0x3B, 0xD4, 0x93, 0xC3, 0x30, 0xB4,
0x4B, 0xA6, 0x3F, 0x9A, 0x3E, 0x90, 0x86, 0x88, 0x35, 0x83, 0x6F, 0x80, 0x3B, 0x80, 0xA2, 0x82,
0x8E, 0x87, 0xF4, 0x8E, 0x97, 0x98, 0x63, 0xA4, 0xF9, 0xB1, 0x34, 0xC1, 0xA5, 0xD1, 0x16, 0xE3,
0x10, 0xF5, 0x4B, 0x07, 0x5E, 0x19, 0xEA, 0x2A, 0x9E, 0x3B, 0x13, 0x4B, 0x0F, 0x59, 0x33, 0x65,
0x4D, 0x6F, 0x28, 0x77, 0x94, 0x7C, 0x7F, 0x7F, 0xD2, 0x7F, 0x8C, 0x7D, 0xBE, 0x78, 0x7C, 0x71,
0xEE, 0x67, 0x45, 0x5C, 0xBA, 0x4E, 0x9C, 0x3F, 0x2F, 0x2F, 0xD2, 0x1D, 0xD5, 0x0B, 0xA0, 0xF9,
0x86, 0xE7, 0xF3, 0xD5, 0x30, 0xC5, 0xAB, 0xB5, 0x98, 0xA7, 0x5F, 0x9B, 0x24, 0x91, 0x2F, 0x89,
0xA4, 0x83, 0x93, 0x80, 0x28, 0x80, 0x41, 0x82, 0xF9, 0x86, 0x17, 0x8E, 0x8D, 0x97, 0x19, 0xA3,
0x8D, 0xB0, 0x9B, 0xBF, 0xF7, 0xCF, 0x4E, 0xE1, 0x41, 0xF3, 0x78, 0x05, 0x91, 0x17, 0x35, 0x29,
0xFA, 0x39, 0x9F, 0x49, 0xB6, 0x57, 0x16, 0x64, 0x63, 0x6E, 0x7B, 0x76, 0x25, 0x7C, 0x52, 0x7F,
0xE7, 0x7F, 0xE5, 0x7D, 0x57, 0x79, 0x4F, 0x72, 0xFC, 0x68, 0x86, 0x5D, 0x29, 0x50, 0x2E, 0x41,
0xE1, 0x30, 0x96, 0x1F, 0xA8, 0x0D, 0x6F, 0xFB, 0x55, 0xE9, 0xA7, 0xD7, 0xD7, 0xC6, 0x25, 0xB7,
0xED, 0xA8, 0x82, 0x9C, 0x11, 0x92, 0xDF, 0x89, 0x16, 0x84, 0xC2, 0x80, 0x15, 0x80, 0xF1, 0x81,
0x60, 0x86, 0x48, 0x8D, 0x7E, 0x96, 0xDC, 0xA1, 0x23, 0xAF, 0x07, 0xBE, 0x4A, 0xCE, 0x86, 0xDF,
0x72, 0xF1, 0xA5, 0x03, 0xC9, 0x15, 0x75, 0x27, 0x5D, 0x38, 0x1B, 0x48, 0x63, 0x56, 0xEF, 0x62,
0x74, 0x6D, 0xC5, 0x75, 0xB5, 0x7B, 0x1B, 0x7F, 0xF8, 0x7F, 0x35, 0x7E, 0xE7, 0x79, 0x21, 0x73,
0x02, 0x6A, 0xC4, 0x5E, 0x90, 0x51, 0xC2, 0x42, 0x8C, 0x32, 0x5B, 0x21, 0x77, 0x0F, 0x42, 0xFD,
0x21, 0xEB, 0x65, 0xD9, 0x77, 0xC8, 0xA7, 0xB8, 0x47, 0xAA, 0xAB, 0x9D, 0xFF, 0x92, 0x9B, 0x8A,
0x88, 0x84, 0x00, 0x81, 0x04, 0x80, 0xA4, 0x81, 0xD4, 0x85, 0x79, 0x8C, 0x7D, 0x95, 0x9D, 0xA0,
0xC0, 0xAD, 0x74, 0xBC, 0xA1, 0xCC, 0xC2, 0xDD, 0xA4, 0xEF, 0xD1, 0x01, 0xFB, 0x13, 0xB9, 0x25,
0xBA, 0x36, 0x95, 0x46, 0x0A, 0x55, 0xC3, 0x61, 0x7F, 0x6C, 0x0D, 0x75, 0x36, 0x7B, 0xE3, 0x7E,
0xFF, 0x7F, 0x7D, 0x7E, 0x75, 0x7A, 0xE7, 0x73, 0x08, 0x6B, 0xF8, 0x5F, 0xFB, 0x52, 0x47, 0x44,
0x3F, 0x34, 0x18, 0x23, 0x48, 0x11, 0x14, 0xFF, 0xEF, 0xEC, 0x22, 0xDB, 0x1F, 0xCA, 0x2C, 0xBA,
0xA2, 0xAB, 0xD9, 0x9E, 0xF9, 0x93, 0x55, 0x8B, 0x0A, 0x85, 0x3A, 0x81, 0x01, 0x80, 0x5C, 0x81,
0x4A, 0x85, 0xB5, 0x8B, 0x7B, 0x94, 0x6D, 0x9F, 0x54, 0xAC, 0xF2, 0xBA, 0xEE, 0xCA, 0x08, 0xDC,
0xD1, 0xED
};
static const u8 data_44100_24[1323] = {
0x00, 0x00, 0x00, 0xDE, 0x2C, 0x12, 0x74, 0xFB, 0x23, 0x5B, 0x0F, 0x35, 0xFF, 0x0F, 0x45, 0x5B,
0xAA, 0x53, 0xA9, 0x92, 0x60, 0xFA, 0x85, 0x6B, 0x74, 0x4B, 0x74, 0xA1, 0xB5, 0x7A, 0x34, 0xA3,
0x7E, 0xC9, 0xFF, 0x7F, 0x5B, 0xC4, 0x7E, 0x3C, 0xF7, 0x7A, 0x3E, 0xAC, 0x74, 0xE6, 0x03, 0x6C,
0x42, 0x2B, 0x61, 0x78, 0x5A, 0x54, 0x16, 0xD4, 0x45, 0x73, 0xE3, 0x35, 0x3A, 0xDB, 0x24, 0xD1,
0x13, 0x13, 0x70, 0xE9, 0x00, 0x4E, 0xBA, 0xEE, 0xCF, 0xE4, 0xDC, 0x6A, 0xC5, 0xCB, 0xFE, 0xB4,
0xBB, 0xD8, 0x06, 0xAD, 0x2D, 0x07, 0xA0, 0x5E, 0xF9, 0x94, 0xD4, 0x16, 0x8C, 0x93, 0x8D, 0x85,
0x9A, 0x7F, 0x81, 0xDD, 0x01, 0x80, 0x28, 0x1C, 0x81, 0xBC, 0xC8, 0x84, 0x86, 0xF4, 0x8A, 0x8A,
0x7F, 0x93, 0x72, 0x3D, 0x9E, 0x7E, 0xF6, 0xAA, 0xBD, 0x68, 0xB9, 0x2B, 0x49, 0xC9, 0x77, 0x45,
0xDA, 0x7D, 0x05, 0xEC, 0x25, 0x2D, 0xFE, 0x48, 0x5E, 0x10, 0x7D, 0x3A, 0x22, 0x21, 0x65, 0x33,
0x24, 0x85, 0x43, 0xDE, 0x46, 0x52, 0xBE, 0x5D, 0x5F, 0xE6, 0x85, 0x6A, 0x66, 0x85, 0x73, 0x9C,
0x2D, 0x7A, 0xFA, 0x5B, 0x7E, 0xCC, 0xFA, 0x7F, 0xB2, 0x01, 0x7F, 0xB2, 0x75, 0x7B, 0x33, 0x69,
0x75, 0x99, 0xFB, 0x6C, 0x9D, 0x58, 0x62, 0x68, 0xB7, 0x55, 0x8A, 0x59, 0x47, 0x80, 0x89, 0x37,
0x59, 0x99, 0x26, 0xF8, 0xE0, 0x14, 0x3A, 0xBC, 0x02, 0x5C, 0x89, 0xF0, 0xA5, 0xA6, 0xDE, 0x02,
0x71, 0xCD, 0x99, 0x41, 0xBD, 0x80, 0x6C, 0xAE, 0x90, 0x3E, 0xA1, 0x3C, 0xFC, 0x95, 0xE2, 0xDF,
0x8C, 0xC8, 0x18, 0x86, 0x1B, 0xCA, 0x81, 0x2E, 0x0A, 0x80, 0x1C, 0xE2, 0x80, 0x7D, 0x4D, 0x84,
0x9A, 0x3A, 0x8A, 0xAC, 0x8A, 0x92, 0xA0, 0x12, 0x9D, 0xC7, 0x9B, 0xA9, 0x23, 0xE5, 0xB7, 0x8A,
0xA4, 0xC7, 0x57, 0x88, 0xD8, 0xDE, 0x38, 0xEA, 0x67, 0x5A, 0xFC, 0xD6, 0x8E, 0x0E, 0xC1, 0x77,
0x20, 0x3C, 0xB8, 0x31, 0xC3, 0xF6, 0x41, 0x1C, 0xDF, 0x50, 0xDF, 0x23, 0x5E, 0x48, 0x80, 0x69,
0x56, 0xB9, 0x72, 0x3D, 0x9F, 0x79, 0x30, 0x0E, 0x7E, 0x27, 0xEF, 0x7F, 0x74, 0x38, 0x7F, 0xB8,
0xED, 0x7B, 0x14, 0x20, 0x76, 0x9E, 0xED, 0x6D, 0xDD, 0x80, 0x63, 0xE5, 0x0F, 0x57, 0x48, 0xDB,
0x48, 0xAC, 0x2C, 0x39, 0x77, 0x55, 0x28, 0x03, 0xAD, 0x16, 0xEA, 0x8E, 0x04, 0x2D, 0x59, 0xF2,
0x40, 0x6A, 0xE0, 0x32, 0x1F, 0xCF, 0xB4, 0xD1, 0xBE, 0x5C, 0xD6, 0xAF, 0xE7, 0x7A, 0xA2, 0x98,
0x04, 0x97, 0xED, 0xAE, 0x8D, 0x53, 0xAA, 0x86, 0x28, 0x1B, 0x82, 0x2B, 0x19, 0x80, 0xA5, 0xAE,
0x80, 0xB2, 0xD8, 0x83, 0xC4, 0x86, 0x89, 0x86, 0x9B, 0x91, 0xF2, 0xEC, 0x9B, 0x8B, 0x45, 0xA8,
0x49, 0x65, 0xB6, 0xD6, 0x02, 0xC6, 0x44, 0xCD, 0xD6, 0x64, 0x6D, 0xE8, 0xD6, 0x87, 0xFA, 0xA4,
0xBE, 0x0C, 0x53, 0xB3, 0x1E, 0xC2, 0x08, 0x30, 0xF6, 0x64, 0x40, 0x24, 0x73, 0x4F, 0x1C, 0xE5,
0x5C, 0x2E, 0x75, 0x68, 0x52, 0xE7, 0x71, 0x8C, 0x0A, 0x79, 0xD8, 0xB9, 0x7D, 0xDE, 0xDC, 0x7F,
0x98, 0x68, 0x7F, 0x4E, 0x5F, 0x7C, 0xD1, 0xD0, 0x76, 0xEC, 0xD9, 0x6E, 0xF2, 0xA3, 0x64, 0xDC,
0x63, 0x58, 0x3C, 0x59, 0x4A, 0xDC, 0xCC, 0x3A, 0x81, 0x0F, 0x2A, 0xDF, 0x77, 0x18, 0x5B, 0x61,
0x06, 0xB8, 0x29, 0xF4, 0x7A, 0x2F, 0xE2, 0xF2, 0xCF, 0xD0, 0x2C, 0x65, 0xC0, 0x69, 0x44, 0xB1,
0x14, 0xBC, 0xA3, 0x6A, 0x12, 0x98, 0xEB, 0x83, 0x8E, 0x28, 0x42, 0x87, 0xC8, 0x72, 0x82, 0xC3,
0x2E, 0x80, 0xD2, 0x81, 0x80, 0x54, 0x6A, 0x83, 0x20, 0xD9, 0x88, 0x15, 0xB2, 0x90, 0x7A, 0xCC,
0x9A, 0xDE, 0xF3, 0xA6, 0x3F, 0xE9, 0xB4, 0x2A, 0x64, 0xC4, 0x50, 0x14, 0xD5, 0x29, 0xA3, 0xE6,
0x8A, 0xB5, 0xF8, 0xCA, 0xED, 0x0A, 0x4C, 0xED, 0x1C, 0xC8, 0x56, 0x2E, 0xD4, 0xCF, 0x3E, 0x09,
0x03, 0x4E, 0x88, 0xA1, 0x5B, 0xA2, 0x64, 0x67, 0x66, 0x0F, 0x71, 0x8E, 0x6F, 0x78, 0xFA, 0x5E,
0x7D, 0xF0, 0xC3, 0x7F, 0x1A, 0x92, 0x7F, 0x70, 0xCA, 0x7C, 0x62, 0x7B, 0x77, 0x76, 0xC0, 0x6F,
0xCE, 0xC1, 0x65, 0x38, 0xB3, 0x59, 0x54, 0xD3, 0x4B, 0x04, 0x6A, 0x3C, 0x52, 0xC7, 0x2B, 0x7E,
0x41, 0x1A, 0x72, 0x33, 0x08, 0xE0, 0xFA, 0xF5, 0x46, 0xF6, 0xE3, 0x1E, 0x83, 0xD2, 0xFA, 0xFB,
0xC1, 0x88, 0xB6, 0xB2, 0x10, 0x02, 0xA5, 0xA4, 0x25, 0x99, 0xCA, 0x5E, 0x8F, 0x47, 0xE0, 0x87,
0xEA, 0xD0, 0x82, 0x04, 0x4B, 0x80, 0xA0, 0x5B, 0x80, 0x6C, 0x02, 0x83, 0xAD, 0x31, 0x88, 0x6F,
0xCE, 0x8F, 0x42, 0xB1, 0x99, 0xD1, 0xA6, 0xA5, 0x20, 0x71, 0xB3, 0x90, 0xC8, 0xC2, 0xA0, 0x5D,
0xD3, 0x34, 0xDA, 0xE4, 0xA9, 0xE3, 0xF6, 0x58, 0x1C, 0x09, 0xCA, 0x25, 0x1B, 0x62, 0xA2, 0x2C,
0x6C, 0x37, 0x3D, 0xE5, 0x8E, 0x4C, 0x2C, 0x59, 0x5A, 0xBE, 0x4E, 0x66, 0x90, 0x31, 0x70, 0x56,
0xCE, 0x77, 0x91, 0xFD, 0x7C, 0x62, 0xA4, 0x7F, 0xFC, 0xB4, 0x7F, 0x14, 0x2F, 0x7D, 0xBD, 0x1F,
0x78, 0x31, 0xA1, 0x70, 0x5F, 0xDA, 0x66, 0xF0, 0xFD, 0x5A, 0x77, 0x49, 0x4D, 0x08, 0x04, 0x3E,
0xE0, 0x7C, 0x2D, 0xBA, 0x09, 0x1C, 0x22, 0x05, 0x0A, 0x8B, 0xCC, 0xF7, 0x83, 0xBE, 0xE5, 0xB0,
0x38, 0xD4, 0xF7, 0x95, 0xC3, 0xB2, 0x2C, 0xB4, 0xC2, 0x4C, 0xA6, 0x34, 0x3E, 0x9A, 0x8B, 0x3F,
0x90, 0x9C, 0x84, 0x88, 0x92, 0x35, 0x83, 0xE6, 0x6D, 0x80, 0x0B, 0x3C, 0x80, 0x0E, 0xA1, 0x82,
0x6A, 0x90, 0x87, 0xA2, 0xF0, 0x8E, 0x58, 0x9B, 0x98, 0x7C, 0x5E, 0xA4, 0xF4, 0xFC, 0xB1, 0x2D,
0x30, 0xC1, 0x3A, 0xA9, 0xD1, 0xB0, 0x12, 0xE3, 0x3A, 0x12, 0xF5, 0x72, 0x4A, 0x07, 0xDA, 0x5C,
0x19, 0xAF, 0xEB, 0x2A, 0xD4, 0x9B, 0x3B, 0xC5, 0x16, 0x4B, 0x1E, 0x0C, 0x59, 0x89, 0x33, 0x65,
0xEA, 0x4D, 0x6F, 0xDF, 0x26, 0x77, 0xB0, 0x95, 0x7C, 0x2A, 0x7E, 0x7F, 0x3F, 0xD1, 0x7F, 0x36,
0x8D, 0x7D, 0xDA, 0xBD, 0x78, 0x14, 0x7C, 0x71, 0x98, 0xED, 0x67, 0xE8, 0x43, 0x5C, 0x9C, 0xBB,
0x4E, 0xCF, 0x9A, 0x3F, 0x12, 0x30, 0x2F, 0x84, 0xD0, 0x1D, 0x47, 0xD6, 0x0B, 0xA9, 0x9E, 0xF9,
0x1C, 0x88, 0xE7, 0x84, 0xF0, 0xD5, 0x20, 0x33, 0xC5, 0xC5, 0xA6, 0xB5, 0x25, 0x9C, 0xA7, 0x0C,
0x5C, 0x9B, 0x18, 0x26, 0x91, 0x2C, 0x2F, 0x89, 0xB3, 0xA0, 0x83, 0x68, 0x97, 0x80, 0x22, 0x23,
0x80, 0x28, 0x46, 0x82, 0x74, 0xF5, 0x86, 0xAE, 0x18, 0x8E, 0xD2, 0x8A, 0x97, 0xE4, 0x1A, 0xA3,
0xDE, 0x8C, 0xB0, 0x06, 0x9B, 0xBF, 0x41, 0xF7, 0xCF, 0xAB, 0x4C, 0xE1, 0x5D, 0x41, 0xF3, 0x2B,
0x78, 0x05, 0x9A, 0x92, 0x17, 0xBD, 0x32, 0x29, 0x29, 0xFD, 0x39, 0xB8, 0x9A, 0x49, 0x76, 0xBA,
0x57, 0x0A, 0x13, 0x64, 0x80, 0x64, 0x6E, 0x34, 0x79, 0x76, 0x57, 0x27, 0x7C, 0x53, 0x51, 0x7F,
0xDE, 0xE6, 0x7F, 0xD0, 0xE4, 0x7D, 0xB2, 0x55, 0x79, 0x10, 0x51, 0x72, 0x6A, 0xFB, 0x68, 0x18,
0x85, 0x5D, 0xA6, 0x29, 0x50, 0x48, 0x2E, 0x41, 0xD3, 0xE0, 0x30, 0xBA, 0x95, 0x1F, 0xD9, 0xA6,
0x0D, 0x11, 0x71, 0xFB, 0x00, 0x53, 0xE9, 0x88, 0xAA, 0xD7, 0x52, 0xD3, 0xC6, 0xBC, 0x24, 0xB7,
0x19, 0xF0, 0xA8, 0x22, 0x7F, 0x9C, 0x65, 0x12, 0x92, 0xE8, 0xDF, 0x89, 0x4B, 0x12, 0x84, 0x8C,
0xC7, 0x80, 0xD8, 0x10, 0x80, 0xD0, 0xF1, 0x81, 0xC4, 0x60, 0x86, 0xA6, 0x46, 0x8D, 0xBE, 0x7F,
0x96, 0x1D, 0xDC, 0xA1, 0xE6, 0x20, 0xAF, 0x3E, 0x09, 0xBE, 0xC0, 0x47, 0xCE, 0x42, 0x88, 0xDF,
0x2A, 0x71, 0xF1, 0x99, 0xA5, 0x03, 0x21, 0xC7, 0x15, 0xAA, 0x77, 0x27, 0x74, 0x5B, 0x38, 0xE0,
0x1A, 0x48, 0x38, 0x64, 0x56, 0x61, 0xED, 0x62, 0x50, 0x75, 0x6D, 0x6A, 0xC5, 0x75, 0x80, 0xB2,
0x7B, 0xE9, 0x1D, 0x7F, 0xCC, 0xF5, 0x7F, 0xEA, 0x35, 0x7E, 0x34, 0xE7, 0x79, 0x20, 0x20, 0x73,
0xC6, 0x03, 0x6A, 0x6C, 0xC1, 0x5E, 0x86, 0x93, 0x51, 0x60, 0xBE, 0x42, 0x05, 0x8F, 0x32, 0x54,
0x59, 0x21, 0xAC, 0x76, 0x0F, 0xBF, 0x43, 0xFD, 0x0C, 0x1F, 0xEB, 0xA6, 0x66, 0xD9, 0x7F, 0x76,
0xC8, 0x78, 0xA6, 0xB8, 0x96, 0x48, 0xAA, 0x64, 0xA7, 0x9D, 0x66, 0x04, 0x93, 0xCE, 0x96, 0x8A,
0x4C, 0x8A, 0x84, 0x52, 0xFE, 0x80, 0x30, 0x05, 0x80, 0x08, 0xA4, 0x81, 0x64, 0xD2, 0x85, 0x98,
0x7A, 0x8C, 0x1E, 0x7A, 0x95, 0x3F, 0xA2, 0xA0, 0x23, 0xB9, 0xAD, 0xDC, 0x7A, 0xBC, 0xE0, 0x9A,
0xCC, 0x82, 0xC5, 0xDD, 0xB8, 0xA1, 0xEF, 0xDB, 0xD2, 0x01, 0x81, 0xFA, 0x13, 0x8C, 0xBA, 0x25,
0xD3, 0xB6, 0x36, 0x45, 0x97, 0x46, 0x80, 0x09, 0x55, 0x8E, 0xC2, 0x61, 0x77, 0x80, 0x6C, 0x7A,
0x0B, 0x75, 0x43, 0x37, 0x7B, 0xDB, 0xE3, 0x7E, 0x1E, 0xFE, 0x7F, 0x6B, 0x80, 0x7E, 0x68, 0x72,
0x7A, 0x32, 0xE9, 0x73, 0x9C, 0x06, 0x6B, 0xD8, 0xF8, 0x5F, 0x24, 0xF9, 0x52, 0x03, 0x4B, 0x44,
0x96, 0x3A, 0x34, 0x32, 0x1B, 0x23, 0xB0, 0x45, 0x11, 0x92, 0x16, 0xFF, 0x2E, 0xEC, 0xEC, 0xC6,
0x24, 0xDB, 0x8E, 0x1C, 0xCA, 0xE8, 0x2B, 0xBA, 0x8A, 0xA5, 0xAB, 0xBD, 0xD4, 0x9E, 0x1A, 0xFC,
0x93, 0xC2, 0x53, 0x8B, 0xC4, 0x08, 0x85, 0xA6, 0x3B, 0x81, 0x35, 0x00, 0x80, 0xCE, 0x5C, 0x81,
0x5E, 0x4A, 0x85, 0x8A, 0xB4, 0x8B, 0x0B, 0x7A, 0x94, 0x51, 0x6D, 0x9F, 0xAC, 0x55, 0xAC, 0xFB,
0xEF, 0xBA, 0xA6, 0xF0, 0xCA, 0x8E, 0x04, 0xDC, 0x20, 0xD3, 0xED
};
extern const int LC3_INT24bit_INOUT;
static int test_sample_rate = 44100;
static int test_channel = 1;
static int test_bitrate = 320000;
static void *virtual_hdl;
static FILE *pcm_fd;
static int virtual_pid;
static int data_offset;
static u8 *sin_data;
static u8 *tmp_data;
static int sin_data_len;
static void *cahe_buf = NULL;
static cbuffer_t save_cbuf;
static void *enc_server;
static void *dec_server;
static u8 run_flag;
static u8 enc_flag;
static OS_SEM r_sem;
static OS_SEM w_sem;
//编码器输出LC3数据
static int pcm_vfs_fwrite(void *file, void *data, u32 len)
{
//拿到数据填入cbuf
cbuffer_t *cbuf = (cbuffer_t *)file;
while (!cbuf_write(cbuf, data, len)) {
#if 1
//如果写不进去, 等待数据读取 (要求完整性)
os_sem_pend(&w_sem, 200);
#else
//如果写不进去了,则清空一下cbuf(这一步目的为了不让接收数据有延迟,要求实时性)
cbuf_clear(cbuf);
#endif
}
os_sem_set(&r_sem, 0);
os_sem_post(&r_sem);
return len;
}
//解码器读取数据,这里将数据传入LC3解码器,数据需要给足len的长度
static int pcm_vfs_fread(void *file, void *data, u32 len)
{
//从cbuf取数据
cbuffer_t *cbuf = (cbuffer_t *)file;
do {
if (cbuf_read(cbuf, data, len)) {
os_sem_set(&w_sem, 0);
os_sem_post(&w_sem);
break;
}
os_sem_pend(&r_sem, 200);
if (!enc_flag) {
return 0;
}
if (!run_flag) {
return 0;
}
} while (run_flag);
return len;
}
static int pcm_vfs_fclose(void *file)
{
return 0;
}
static int pcm_vfs_flen(void *file)
{
return 0;
}
static const struct audio_vfs_ops pcm_vfs_ops = {
.fwrite = pcm_vfs_fwrite,
.fread = pcm_vfs_fread,
.fclose = pcm_vfs_fclose,
.flen = pcm_vfs_flen,
};
/***************dec******************/
static int test_dec_close(void)
{
union audio_req req = {0};
run_flag = 0;
thread_kill(&virtual_pid, KILL_WAIT);
if (dec_server) {
req.dec.cmd = AUDIO_DEC_STOP;
server_request(dec_server, AUDIO_REQ_DEC, &req);
}
if (cahe_buf) {
free(cahe_buf);
}
if (pcm_fd) {
fclose(pcm_fd);
}
if (LC3_INT24bit_INOUT && sin_data) {
free(sin_data);
}
virtual_hdl = NULL;
return 0;
}
static void dec_server_event_handler(void *priv, int argc, int *argv)
{
switch (argv[0]) {
case AUDIO_SERVER_EVENT_ERR:
case AUDIO_SERVER_EVENT_END:
test_dec_close();
break;
default:
break;
}
}
static void virtual_get_data(void *priv)
{
struct audio_cbuf_t *virtual = (struct audio_cbuf_t *)priv;
if (!virtual) {
return;
}
int rlen = 0;
u8 buf[1024];
while (run_flag) {
os_sem_post(virtual->wr_sem);
rlen = cbuf_read(virtual->cbuf, buf, 1024);
if (LC3_INT24bit_INOUT) {
for (int i = 0; i < rlen / 4; i++) {
memcpy(buf + i * 3, buf + i * 4, 3);
}
}
if (rlen == 1024) {
fwrite(buf, 1, rlen / 4 * 3, pcm_fd);
continue;
}
//收到end为1, 把剩余的数据读出
if (virtual->end) {
virtual->end = 2;
os_sem_post(virtual->wr_sem);
rlen = cbuf_get_data_size(virtual->cbuf);
cbuf_read(virtual->cbuf, buf, rlen);
if (LC3_INT24bit_INOUT) {
for (int i = 0; i < rlen / 4; i++) {
memcpy(buf + i * 3, buf + i * 4, 3);
}
}
fwrite(buf, 1, rlen / 4 * 3, pcm_fd);
break;
}
putchar('<');
//等待解码器post信号量
os_sem_pend(virtual->rd_sem, 0);
putchar('>');
}
return;
}
static void dec_test()
{
int err;
union audio_req req = {0};
dec_server = server_open("audio_server", "dec");
server_register_event_handler_to_task(dec_server, NULL, dec_server_event_handler, "app_core");
req.dec.cmd = AUDIO_DEC_OPEN;
req.dec.output_buf_len = 4 * 1024;
req.dec.channel = test_channel;
req.dec.volume = 50;
req.dec.dec_type = "lc3";
req.dec.sample_rate = test_sample_rate;
//16bit解码到dac输出,由于24bit数据dac不支持播放, 所以将24bit数据写到文件中,在电脑查看数据的正确性
req.dec.sample_source = LC3_INT24bit_INOUT ? "virtual" : "dac";
req.dec.file = &save_cbuf;
req.dec.vfs_ops = &pcm_vfs_ops;
err = server_request(dec_server, AUDIO_REQ_DEC, &req);
if (err) {
printf("-------%s-------%d\n\r", __func__, __LINE__);
return ;
}
run_flag = 1;
if (LC3_INT24bit_INOUT) {
virtual_hdl = req.dec.virtual_audio;
thread_fork("test", 20, 1024, 0, &virtual_pid, virtual_get_data, req.dec.virtual_audio);
}
req.dec.cmd = AUDIO_DEC_START;
err = server_request(dec_server, AUDIO_REQ_DEC, &req);
if (err) {
printf("-------%s-------%d\n\r", __func__, __LINE__);
return ;
}
}
/*******************enc**********************/
//可自己调用该函数,也可设置编码时间,时间到回调AUDIO_SERVER_EVENT_END事件关闭
static int test_enc_close(void)
{
union audio_req req = {0};
enc_flag = 0;
if (enc_server) {
req.enc.cmd = AUDIO_ENC_CLOSE;
server_request(enc_server, AUDIO_REQ_ENC, &req);
}
if (LC3_INT24bit_INOUT) {
struct audio_cbuf_t *virtual = (struct audio_cbuf_t *)virtual_hdl;
//等待end标志位
while (!virtual->end) {
os_time_dly(20);
}
os_sem_post(virtual->rd_sem);
}
return 0;
}
static void enc_server_event_handler(void *priv, int argc, int *argv)
{
switch (argv[0]) {
case AUDIO_SERVER_EVENT_ERR:
case AUDIO_SERVER_EVENT_END:
test_enc_close();
break;
default:
break;
}
}
static int pcm_input(u8 *buf, u32 len)
{
int rlen = len;
int offset = 0;;
int remain = 0;
while (rlen) {
remain = sin_data_len - data_offset;
if (remain >= rlen) {
memcpy(buf + offset, (u8 *)sin_data + data_offset, rlen);
data_offset += rlen;
offset += rlen;
rlen = 0;
} else {
memcpy(buf + offset, (u8 *)sin_data + data_offset, remain);
offset += remain;
data_offset = 0;
rlen -= remain;
}
if (!run_flag) {
return 0;
}
}
return len;
}
static void enc_test()
{
int err;
union audio_req req = {0};
enc_server = server_open("audio_server", "enc");
if (!enc_server) {
printf("failed-------%s-------%d\n\r", __func__, __LINE__);
return ;
}
//将事件回调注册到app_core
server_register_event_handler_to_task(enc_server, NULL, enc_server_event_handler, "app_core");
req.enc.cmd = AUDIO_ENC_OPEN;
req.enc.frame_size = test_sample_rate / 100 * 4 * test_channel;
req.enc.output_buf_len = req.enc.frame_size * 3;
req.enc.channel = test_channel;
req.enc.volume = 50;
req.enc.sample_rate = test_sample_rate;
req.enc.bitrate = test_bitrate; //lc3编码必须传入比特率
req.enc.sample_source = "virtual"; //数据输入方式
req.enc.file = (FILE *)&save_cbuf;
req.enc.vfs_ops = &pcm_vfs_ops;
req.enc.read_input = pcm_input;
req.enc.vir_data_wait = 1; //等待编码数据处理标志位, 不要求实时性,要求数据完整性可以置1
req.enc.format = "lc3";
if (LC3_INT24bit_INOUT) {
//置1采样深度是24bit, 置0采样深度是16bit
req.enc.sample_depth = 1;
}
req.enc.msec = 30 * 1000; //单位ms,编码多少时间后关闭编码器
err = server_request(enc_server, AUDIO_REQ_ENC, &req);
if (err) {
printf("-------%s-------%d\n\r", __func__, __LINE__);
return ;
}
enc_flag = 1;
}
void test()
{
//1. 如为24bit数据, 则先转换成32bit格式
if (LC3_INT24bit_INOUT) {
sin_data_len = sizeof(data_44100_24) * 4 / 3;
tmp_data = data_44100_24;
sin_data = zalloc(sin_data_len);
if (!sin_data) {
printf("---%s---%s---%d\n\r", __FILE__, __func__, __LINE__);
return;
}
for (int i = 0; i < sin_data_len / 4; i++) {
*((s32 *)sin_data + i) = (s32)(*(tmp_data + i * 3) << 0 | *(tmp_data + i * 3 + 1) << 8 | *(tmp_data + i * 3 + 2) << 16) << 8 >> 8;
}
} else {
sin_data_len = sizeof(data_44100_16);
sin_data = data_44100_16;
}
//2. 创建cbuf
cahe_buf = zalloc(test_sample_rate * test_channel * 1);
if (!cahe_buf) {
printf("-------%s-------%d\n\r", __func__, __LINE__);
return ;
}
cbuf_init(&save_cbuf, cahe_buf, test_sample_rate * test_channel * 1);
os_sem_create(&r_sem, 0);
os_sem_create(&w_sem, 0);
if (LC3_INT24bit_INOUT) {
while (!storage_device_ready()) {
os_time_dly(20);
}
pcm_fd = fopen(CONFIG_ROOT_PATH"1.pcm", "w+");
if (!pcm_fd) {
printf("---%s---%s---%d\n\r", __FILE__, __func__, __LINE__);
return;
}
}
//3. 打开编码器, 使用virtual传入pcm数据
enc_test();
//4. 打开解码器, 获取编码后的lc3数据,
dec_test();
}
static void test_test()
{
thread_fork("test_test", 20, 1024, 0, 0, test, 0);
}
late_initcall(test_test);
#endif