1*e638b3c5SMilanka Ringwald /* 2*e638b3c5SMilanka Ringwald * Copyright (C) 2014 BlueKitchen GmbH 3*e638b3c5SMilanka Ringwald * 4*e638b3c5SMilanka Ringwald * Redistribution and use in source and binary forms, with or without 5*e638b3c5SMilanka Ringwald * modification, are permitted provided that the following conditions 6*e638b3c5SMilanka Ringwald * are met: 7*e638b3c5SMilanka Ringwald * 8*e638b3c5SMilanka Ringwald * 1. Redistributions of source code must retain the above copyright 9*e638b3c5SMilanka Ringwald * notice, this list of conditions and the following disclaimer. 10*e638b3c5SMilanka Ringwald * 2. Redistributions in binary form must reproduce the above copyright 11*e638b3c5SMilanka Ringwald * notice, this list of conditions and the following disclaimer in the 12*e638b3c5SMilanka Ringwald * documentation and/or other materials provided with the distribution. 13*e638b3c5SMilanka Ringwald * 3. Neither the name of the copyright holders nor the names of 14*e638b3c5SMilanka Ringwald * contributors may be used to endorse or promote products derived 15*e638b3c5SMilanka Ringwald * from this software without specific prior written permission. 16*e638b3c5SMilanka Ringwald * 4. Any redistribution, use, or modification is done solely for 17*e638b3c5SMilanka Ringwald * personal benefit and not for any commercial purpose or for 18*e638b3c5SMilanka Ringwald * monetary gain. 19*e638b3c5SMilanka Ringwald * 20*e638b3c5SMilanka Ringwald * THIS SOFTWARE IS PROVIDED BY BLUEKITCHEN GMBH AND CONTRIBUTORS 21*e638b3c5SMilanka Ringwald * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 22*e638b3c5SMilanka Ringwald * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 23*e638b3c5SMilanka Ringwald * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL MATTHIAS 24*e638b3c5SMilanka Ringwald * RINGWALD OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, 25*e638b3c5SMilanka Ringwald * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, 26*e638b3c5SMilanka Ringwald * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS 27*e638b3c5SMilanka Ringwald * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED 28*e638b3c5SMilanka Ringwald * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 29*e638b3c5SMilanka Ringwald * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF 30*e638b3c5SMilanka Ringwald * THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 31*e638b3c5SMilanka Ringwald * SUCH DAMAGE. 32*e638b3c5SMilanka Ringwald * 33*e638b3c5SMilanka Ringwald * Please inquire about commercial licensing options at 34*e638b3c5SMilanka Ringwald * [email protected] 35*e638b3c5SMilanka Ringwald * 36*e638b3c5SMilanka Ringwald */ 37*e638b3c5SMilanka Ringwald 38*e638b3c5SMilanka Ringwald // ***************************************************************************** 39*e638b3c5SMilanka Ringwald // 40*e638b3c5SMilanka Ringwald // SBC decoder tests 41*e638b3c5SMilanka Ringwald // 42*e638b3c5SMilanka Ringwald // ***************************************************************************** 43*e638b3c5SMilanka Ringwald 44*e638b3c5SMilanka Ringwald #include "btstack_config.h" 45*e638b3c5SMilanka Ringwald 46*e638b3c5SMilanka Ringwald #include <stdint.h> 47*e638b3c5SMilanka Ringwald #include <stdio.h> 48*e638b3c5SMilanka Ringwald #include <stdlib.h> 49*e638b3c5SMilanka Ringwald #include <string.h> 50*e638b3c5SMilanka Ringwald #include <fcntl.h> 51*e638b3c5SMilanka Ringwald #include <unistd.h> 52*e638b3c5SMilanka Ringwald 53*e638b3c5SMilanka Ringwald #include "oi_assert.h" 54*e638b3c5SMilanka Ringwald 55*e638b3c5SMilanka Ringwald #include "btstack.h" 56*e638b3c5SMilanka Ringwald #include "btstack_sbc.h" 57*e638b3c5SMilanka Ringwald 58*e638b3c5SMilanka Ringwald #include "wav_util.h" 59*e638b3c5SMilanka Ringwald 60*e638b3c5SMilanka Ringwald static char wav_filename[1000]; 61*e638b3c5SMilanka Ringwald static char pklg_filename[1000]; 62*e638b3c5SMilanka Ringwald 63*e638b3c5SMilanka Ringwald static int wav_writer_opened; 64*e638b3c5SMilanka Ringwald static int total_num_samples = 0; 65*e638b3c5SMilanka Ringwald static int frame_count = 0; 66*e638b3c5SMilanka Ringwald 67*e638b3c5SMilanka Ringwald 68*e638b3c5SMilanka Ringwald static void show_usage(void){ 69*e638b3c5SMilanka Ringwald printf("\n\nUsage: ./sco_test input_file\n"); 70*e638b3c5SMilanka Ringwald printf("Example: ./sco_test pklg/test1.pklg\n"); 71*e638b3c5SMilanka Ringwald } 72*e638b3c5SMilanka Ringwald 73*e638b3c5SMilanka Ringwald static ssize_t __read(int fd, void *buf, size_t count){ 74*e638b3c5SMilanka Ringwald ssize_t len, pos = 0; 75*e638b3c5SMilanka Ringwald 76*e638b3c5SMilanka Ringwald while (count > 0) { 77*e638b3c5SMilanka Ringwald len = read(fd, (int8_t * )buf + pos, count); 78*e638b3c5SMilanka Ringwald if (len <= 0) 79*e638b3c5SMilanka Ringwald return pos; 80*e638b3c5SMilanka Ringwald 81*e638b3c5SMilanka Ringwald count -= len; 82*e638b3c5SMilanka Ringwald pos += len; 83*e638b3c5SMilanka Ringwald } 84*e638b3c5SMilanka Ringwald return pos; 85*e638b3c5SMilanka Ringwald } 86*e638b3c5SMilanka Ringwald 87*e638b3c5SMilanka Ringwald 88*e638b3c5SMilanka Ringwald static void handle_pcm_data(int16_t * data, int num_samples, int num_channels, int sample_rate, void * context){ 89*e638b3c5SMilanka Ringwald (void) context; 90*e638b3c5SMilanka Ringwald if (!wav_writer_opened){ 91*e638b3c5SMilanka Ringwald wav_writer_opened = 1; 92*e638b3c5SMilanka Ringwald wav_writer_open(wav_filename, num_channels, sample_rate); 93*e638b3c5SMilanka Ringwald 94*e638b3c5SMilanka Ringwald } 95*e638b3c5SMilanka Ringwald 96*e638b3c5SMilanka Ringwald // printf("Sampels: num_samples %u, num_channels %u, sample_rate %u\n", num_samples, num_channels, sample_rate); 97*e638b3c5SMilanka Ringwald // printf_hexdump(data, num_samples * num_channels * 2); 98*e638b3c5SMilanka Ringwald // int i; 99*e638b3c5SMilanka Ringwald // for (i=0;i<num_channels*num_samples;i += 2){ 100*e638b3c5SMilanka Ringwald // if ((i%24) == 0) printf("\n"); 101*e638b3c5SMilanka Ringwald // printf ("%12d ", data[i]); 102*e638b3c5SMilanka Ringwald // } 103*e638b3c5SMilanka Ringwald // printf("\n"); 104*e638b3c5SMilanka Ringwald wav_writer_write_int16(num_samples*num_channels, data); 105*e638b3c5SMilanka Ringwald 106*e638b3c5SMilanka Ringwald total_num_samples+=num_samples*num_channels; 107*e638b3c5SMilanka Ringwald frame_count++; 108*e638b3c5SMilanka Ringwald } 109*e638b3c5SMilanka Ringwald 110*e638b3c5SMilanka Ringwald int main (int argc, const char * argv[]){ 111*e638b3c5SMilanka Ringwald if (argc < 2){ 112*e638b3c5SMilanka Ringwald show_usage(); 113*e638b3c5SMilanka Ringwald return -1; 114*e638b3c5SMilanka Ringwald } 115*e638b3c5SMilanka Ringwald 116*e638b3c5SMilanka Ringwald int argv_pos = 1; 117*e638b3c5SMilanka Ringwald const char * filename = argv[argv_pos++]; 118*e638b3c5SMilanka Ringwald 119*e638b3c5SMilanka Ringwald btstack_sbc_mode_t mode = SBC_MODE_mSBC; 120*e638b3c5SMilanka Ringwald 121*e638b3c5SMilanka Ringwald strcpy(pklg_filename, filename); 122*e638b3c5SMilanka Ringwald strcat(pklg_filename, ".pklg"); 123*e638b3c5SMilanka Ringwald 124*e638b3c5SMilanka Ringwald strcpy(wav_filename, filename); 125*e638b3c5SMilanka Ringwald strcat(wav_filename, ".wav"); 126*e638b3c5SMilanka Ringwald 127*e638b3c5SMilanka Ringwald 128*e638b3c5SMilanka Ringwald int fd = open(pklg_filename, O_RDONLY); 129*e638b3c5SMilanka Ringwald if (fd < 0) { 130*e638b3c5SMilanka Ringwald printf("Can't open file %s", pklg_filename); 131*e638b3c5SMilanka Ringwald return -1; 132*e638b3c5SMilanka Ringwald } 133*e638b3c5SMilanka Ringwald printf("Open pklg file: %s\n", pklg_filename); 134*e638b3c5SMilanka Ringwald 135*e638b3c5SMilanka Ringwald 136*e638b3c5SMilanka Ringwald btstack_sbc_decoder_state_t state; 137*e638b3c5SMilanka Ringwald btstack_sbc_decoder_init(&state, mode, &handle_pcm_data, NULL); 138*e638b3c5SMilanka Ringwald 139*e638b3c5SMilanka Ringwald int sco_packet_counter = 0; 140*e638b3c5SMilanka Ringwald while (1){ 141*e638b3c5SMilanka Ringwald int bytes_read; 142*e638b3c5SMilanka Ringwald // get next packet 143*e638b3c5SMilanka Ringwald uint8_t header[13]; 144*e638b3c5SMilanka Ringwald bytes_read = __read(fd, header, sizeof(header)); 145*e638b3c5SMilanka Ringwald if (0 >= bytes_read) break; 146*e638b3c5SMilanka Ringwald 147*e638b3c5SMilanka Ringwald uint8_t packet[256]; 148*e638b3c5SMilanka Ringwald uint32_t size = big_endian_read_32(header, 0) - 9; 149*e638b3c5SMilanka Ringwald bytes_read = __read(fd, packet, size); 150*e638b3c5SMilanka Ringwald 151*e638b3c5SMilanka Ringwald uint8_t type = header[12]; 152*e638b3c5SMilanka Ringwald if (type != 9) continue; 153*e638b3c5SMilanka Ringwald sco_packet_counter++; 154*e638b3c5SMilanka Ringwald 155*e638b3c5SMilanka Ringwald // printf("Packet %4u, flags %x: ", sco_packet_counter, (packet[1] >> 4)); 156*e638b3c5SMilanka Ringwald // printf_hexdump(packet+3, size-3); 157*e638b3c5SMilanka Ringwald btstack_sbc_decoder_process_data(&state, (packet[1] >> 4) & 3, packet+3, size-3); 158*e638b3c5SMilanka Ringwald } 159*e638b3c5SMilanka Ringwald 160*e638b3c5SMilanka Ringwald wav_writer_close(); 161*e638b3c5SMilanka Ringwald close(fd); 162*e638b3c5SMilanka Ringwald int total_frames_nr = state.good_frames_nr + state.bad_frames_nr + state.zero_frames_nr; 163*e638b3c5SMilanka Ringwald 164*e638b3c5SMilanka Ringwald printf("WAV Writer: Decoding done. Processed totaly %d frames:\n - %d good\n - %d bad\n", total_frames_nr, state.good_frames_nr, total_frames_nr - state.good_frames_nr); 165*e638b3c5SMilanka Ringwald printf("Write %d frames to wav file: %s\n\n", frame_count, wav_filename); 166*e638b3c5SMilanka Ringwald 167*e638b3c5SMilanka Ringwald } 168