startPlayerFromStream method

Future<int> startPlayerFromStream(
  1. FlutterSoundPlayerCallback callback, {
  2. Codec codec = Codec.pcm16,
  3. bool interleaved = true,
  4. int numChannels = 1,
  5. int sampleRate = 16000,
  6. int bufferSize = 8192,
})

Implementation

Future<int> startPlayerFromStream(
  FlutterSoundPlayerCallback callback, {
  Codec codec = Codec.pcm16,
  bool interleaved = true,
  int numChannels = 1,
  int sampleRate = 16000,
  int bufferSize = 8192,
  //TWhenFinished? whenFinished,
}) async {
  this.callback = callback;
  this.interleaved = interleaved;
  this.numChannels = numChannels;
  this.sampleRate = sampleRate;
  this.codec = codec;
  callback.log(Level.debug, 'Start startPlayerFromStream to Stream');
  //await AsyncWorkletNode.init();
  assert(audioCtx == null);
  AudioContextOptions audioCtxOptions = AudioContextOptions(
    sampleRate: sampleRate,
  );
  audioCtx = AudioContext(audioCtxOptions);
  if (!javascriptScriptLoaded) {
    await audioCtx!.audioWorklet
        .addModule(
          "./assets/packages/flutter_sound_web/src/flutter_sound_stream_processor.js",
        )
        .toDart;
    javascriptScriptLoaded = true;
  }
  AudioWorkletNodeOptions options = AudioWorkletNodeOptions(
    channelCount: numChannels,
    numberOfInputs: 0,
    numberOfOutputs: 1,
    outputChannelCount: [numChannels.toJS].toJS,
  );
  streamNode = AudioWorkletNode(
    audioCtx!,
    "flutter-sound-stream-processor",
    options,
  );

  streamNode!.port.onmessage = (MessageEvent e) {
    var x = e.type;
    var y = e.origin;
    var d = e.data;
    var msg = d!.dartify() as Map;
    var msgType = msg['msgType'];
    switch (msgType) {
      case 'NEED_SOME_FOOD':
        callback.needSomeFood(0);
        break;
      case 'LOG':
        logMsg(msg);
        break;
      case 'BUFFER_UNDERFLOW':
        callback.audioPlayerFinished(1);
        break;
      case 'ERROR':
        error(msg);
    }
    //int inputNo = (d!.getProperty('inputNo'.toJS) as JSNumber).toDartInt;
    //print('zozo');
  }.toJS;

  JSObject obj = JSObject();
  setProperty(obj, 'msgType', 'START_PLAYER');
  setProperty(obj, 'isFloat32', codec == Codec.pcmFloat32);
  setProperty(obj, 'nbrChannels', numChannels);
  setProperty(obj, 'isInterleaved', interleaved);
  streamNode!.port.postMessage(obj);

  streamNode!.connect(audioCtx!.destination);

  //streamNode!.onBufferUnderflow((int outputNo) {
  //callback.needSomeFood(0);
  //_logger.d('onBufferUnderflow($outputNo)');
  //});

  callback.startPlayerCompleted(1 /*PlayerState.playing.index*/, true, 0);
  return 1; //PlayerState.playing.index; // PlayerState.isPlaying;
}