#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