проблема аудио-эхо проекта при записи данных - PullRequest
0 голосов
/ 21 февраля 2019

Я работаю в караоке-приложении для Android, это пример: https://github.com/koseonjae/Karaoke Эта база на примере Google , пожалуйста, посмотрите на этот ствол:

if(fos == nullptr)
        fos = fopen("/sdcard/recorded_audio.pcm", "wb");
      fwrite(buf->buf_, 1, buf->size_, fos);

Этот фрагмент кода о работе на моем устройстве S7 Samsung, но сбой в другом устройстве, поэтому я изменяю его, чтобы сохранить buf в векторе и выписать при остановке записи:

bool EngineService(void *ctx, uint32_t msg, void *data) {
  assert(ctx == &engine);
  switch (msg) {
    case ENGINE_SERVICE_MSG_RETRIEVE_DUMP_BUFS: {
      *(static_cast<uint32_t *>(data)) = dbgEngineGetBufCount();
      break;
    }
    case ENGINE_SERVICE_MSG_RECORDED_AUDIO_AVAILABLE: {
      // adding audio delay effect
      sample_buf *buf = static_cast<sample_buf *>(data);
      assert(engine.fastPathFramesPerBuf_ ==
             buf->size_ / engine.sampleChannels_ / (engine.bitsPerSample_ / 8));
      engine.delayEffect_->process(reinterpret_cast<int16_t *>(buf->buf_),
                                   engine.fastPathFramesPerBuf_);

      // TODO error crash in some device that has low speed sdcard -> using vector for save data
      /*if(fos == nullptr)
        fos = fopen("/sdcard/recorded_audio.pcm", "wb");
      fwrite(buf->buf_, 1, buf->size_, fos);*/


      sample_buf output = sample_buf();
      output.buf_ = new uint8_t();
      *output.buf_ = *buf->buf_;
      output.size_ = buf->size_;
      bucket.push_back(output);



      break;
    }
    default:
      assert(false);
      return false;
  }

  return true;
}

В функции остановки stopPlay (JNIEnv * env, тип jclass) - я добавил:

if(fos == nullptr)
        fos = fopen("/sdcard/recorded_audio.pcm", "wb");
  LOGE("====stopPlay %u", bucket.size());
  for(auto const& value: bucket) {
    fwrite(value.buf_, 1, value.size_, fos);
  }
  fclose(fos);
  fos = nullptr;

Я не знаю, почему fwrite, который пишет напрямую в sdcard, работает в EngineService, но когда MyВекторное ведро выписать нормально, но я ничего не слышу - только звуковой сигнал ... Кто-то это объясняет?Что-то здесь не так?P / S: Я думаю, что запись в память, как вектор быстрее, чем SDCard?Это правда, не правда ли?Но не работает

...