Я работаю в караоке-приложении для 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?Это правда, не правда ли?Но не работает