отправка аудио через bluetooth a2dp источник esp32 - PullRequest
0 голосов
/ 15 января 2020

Я пытаюсь отправить измеренный аналоговый сигнал i2s (например, от mi c) на приемное устройство через Bluetooth вместо шума по умолчанию. В настоящее время я пытаюсь изменить bt_app_a2d_data_cb()

static int32_t bt_app_a2d_data_cb(uint8_t *data, int32_t i2s_read_len)
{
    if (i2s_read_len < 0 || data == NULL) {
        return 0;
    }

    char* i2s_read_buff = (char*) calloc(i2s_read_len, sizeof(char));

    bytes_read = 0;
    i2s_adc_enable(I2S_NUM_0);
    while(bytes_read == 0)
    {
    i2s_read(I2S_NUM_0,  i2s_read_buff, i2s_read_len,&bytes_read, portMAX_DELAY);
    }
    i2s_adc_disable(I2S_NUM_0);

// taking care of the watchdog//
    TIMERG0.wdt_wprotect=TIMG_WDT_WKEY_VALUE;
    TIMERG0.wdt_feed=1;
    TIMERG0.wdt_wprotect=0;

    uint32_t j = 0;
    uint16_t dac_value = 0;

// change 16bit input signal to 8bit 
    for (int i = 0; i < i2s_read_len; i += 2) {
        dac_value = ((((uint16_t) (i2s_read_buff[i + 1] & 0xf) << 8) | ((i2s_read_buff[i + 0]))));
        data[j] = (uint8_t) dac_value * 256 / 4096;
        j++;
    }

// testing for loop
    //uint8_t da = 0;
        //for (int i = 0; i < i2s_read_len; i++) {
        //  data[i] = (uint8_t) (i2s_read_buff[i] >> 8);//  & 0xff;
            //   da++;
           //  if(da>254) da=0;
        //}

    free(i2s_read_buff);
    i2s_read_buff = NULL;


    return i2s_read_len;
}

Я слышу пилообразный звук из устройства приемника. Есть идеи что делать?

1 Ответ

0 голосов
/ 15 января 2020

ваши данные могут быть массивом некоторых чисел с плавающей запятой, представляющих аналоговые сигналы или вариации аналоговых сигналов, например, звуковой сигнал 32 кГц содержит 320000 чисел с плавающей запятой, которые определяют звук захвата для каждой секунды. если ожидается, что ваши данные будут передаваться в автономном режиме, вы можете подготовить исходящие данные в виде буфера плюс знак терминатора, а затем отправить буфер через модуль Bluetooth устройства-отправителя, которое подключено к соответствующему микроконтроллеру. для принимающего устройства, если вы получили символ-терминатор, такой как "\ r", вы можете обработать входящий буфер, например, для моего случая, мне пришлось отправить массив строк, но я часто получал не более одного или двух неизвестных символов, и чтобы избежать этого, я отклонить его при выполнении получающего контейнера.

как обрезать неизвестные первые символы строки в кодовом видении

, если вы хотите, чтобы он был в онлайн-режиме, т.е. ваши данные должны быть переданы и играли одновременно. Вы должны учитывать задержки и разумное время для обработки всех микроконтроллеров и устройств, таких как Bluetooth, EEprom iCs и ...

...