buildInciensoSession method

InciensoSession buildInciensoSession({
  1. String inciensoId = '',
  2. InciensoSource source = InciensoSource.userCreated,
  3. InciensoSessionEnd endReason = InciensoSessionEnd.stoppedByUser,
})

Build an InciensoSession from the current tracker data. Call after stopping playback.

Implementation

InciensoSession buildInciensoSession({
  String inciensoId = '',
  InciensoSource source = InciensoSource.userCreated,
  InciensoSessionEnd endReason = InciensoSessionEnd.stoppedByUser,
}) {
  final now = DateTime.now();
  return InciensoSession(
    id: 'session_${now.millisecondsSinceEpoch}',
    userId: profile?.id,
    inciensoId: inciensoId,
    inciensoSource: source,
    startedAt: _sessionStartedAt ?? now,
    endedAt: now,
    suggestedDuration: const Duration(minutes: 10),
    rootFrequencyHz: detectedFrequency.value,
    carrierLeftHz: currentFreq.value,
    carrierRightHz: currentFreq.value + currentBeat.value,
    volume: currentVol.value,
    isochronicEnabled: isIsochronicEnabled.value,
    isochronicHz: isochronicFreq.value,
    totalBreathCycles: inciensoTracker.totalCycles,
    inciensoCount: inciensoTracker.inciensoCount,
    avgCoherence: inciensoTracker.avgCoherence,
    peakCoherence: inciensoTracker.peakCoherence,
    minCoherence: inciensoTracker.minCoherence,
    coherenceStdDev: inciensoTracker.coherenceStdDev,
    coherenceTimeline: inciensoTracker.coherenceTimeline,
    avgBreathCycleMs: inciensoTracker.avgBreathCycleMs,
    breathCV: inciensoTracker.breathCV,
    dominantState: inciensoTracker.dominantState,
    stateTimeSeconds: inciensoTracker.stateTimeMap.map(
      (k, v) => MapEntry(k.name, v),
    ),
    stateTransitions: inciensoTracker.stateTransitions,
    breathingGuideActive: breathMode.value != NeomBreathMode.off,
    spatialAudioEnabled: spatialMode.value != NeomSpatialMode.softPan,
    platform: kIsWeb ? 'web' : 'mobile',
    endReason: endReason,
  );
}