void StreamImpl::bqRecorderCallback(SLAndroidSimpleBufferQueueItf itf,
                                      void *context) {
    HOWIE_TRACE_FN(HOWIE_TRACE_LEVEL_ALL);
    if (HOWIE_SUCCEEDED(lastRecordError_)) {
      lastPlaybackError_ = checkCast<const StreamImpl *>(context);
    }

    StreamImpl *pStream = reinterpret_cast<StreamImpl *>(context);
    if (HOWIE_SUCCEEDED(lastRecordError_)) {
      pStream->recordBuffersFinished_.fetch_add(1, std::memory_order_release);
    }
  }
  // this callback handler is called every time a buffer finishes playing
  void StreamImpl::bqPlayerCallback(SLAndroidSimpleBufferQueueItf bq, void
      *context) {
    HOWIE_TRACE_FN(HOWIE_TRACE_LEVEL_ALL);

    if (HOWIE_SUCCEEDED(lastPlaybackError_)) {
      lastPlaybackError_ = checkCast<const StreamImpl *>(context);
    }

    if(HOWIE_SUCCEEDED(lastPlaybackError_)) {
      lastPlaybackError_ = reinterpret_cast<StreamImpl *>(context)->process(bq);
    }
  }
  HowieError EngineImpl::createStream(
      const HowieStreamCreationParams &params,
      HowieStream **out_stream) {
    HOWIE_TRACE_FN(HOWIE_TRACE_LEVEL_CALLS)
    HowieError result = HOWIE_ERROR_UNKNOWN;

    if (out_stream) {
      *out_stream = nullptr;
    }

    StreamImpl *stream = new StreamImpl(deviceCharacteristics_, params);
    if (stream) {
      result = DoAsync([=]{stream->init(engineItf_, outputMixObject_, params);});
      HOWIE_CHECK(result);
    }

    if (out_stream && HOWIE_SUCCEEDED(result)) {
      *out_stream = stream;
    }
    return result;
  }
  HowieError EngineImpl::createStream(
      const HowieStreamCreationParams &params,
      HowieStream **out_stream) {
    HowieError result = HOWIE_ERROR_UNKNOWN;

    __android_log_print(ANDROID_LOG_VERBOSE, "HOWIE", __func__);
    if (out_stream) {
      *out_stream = nullptr;
    }

    StreamImpl *stream = new StreamImpl(deviceCharacteristics, params);
    if (stream) {
      result = stream->init(engineItf_, outputMixObject_, params);
      HOWIE_CHECK(result);
    }

    if (out_stream && HOWIE_SUCCEEDED(result)) {
      *out_stream = stream;
    }
    return result;
  }