Hi there! I'am using bass net with Unity, and everything was fine before i switched to 64 bit builds(Mono->IL2CPP).
My app is suddenly crashing(only on mobile device android), when i play tracks and saving cache to disk.
Here is my main streamHandle
streamHandle = Bass.BASS_StreamCreateURL(url,
0,
BASSFlag.BASS_STREAM_DECODE,
_trackDownloadProc,
IntPtr.Zero);
Then a create fx stream, cause i am using changing tempo and others features
streamTempoFX = BassFx.BASS_FX_TempoCreate(streamHandle , BASSFlag.BASS_FX_FREESOURCE);
If in BASS_StreamCreateURL i use null instead of _trackDownloadProc everything works fine, but with _trackDownloadProc app can crash, it happens in different times, and sometimes works really long, sometimes crashes on 5-6 track play.
Here is _trackDownloadProc
[AOT.MonoPInvokeCallback(typeof(MonoPMessageDelegate))]
//private void TrackDownloadProc(IntPtr buffer, int length, IntPtr user)
private static void TrackDownloadProc(IntPtr buffer, int length, IntPtr user)
{
if (_cachingTrackFilename.IsNullOrWhitespace())
{
return;
}
if (_fs == null)
{
_fs = File.OpenWrite(_cachingTrackFilename);
}
if (buffer == IntPtr.Zero)
{
_fs.Flush();
_fs.Close();
if (_fs != null)
{
((IDisposable) _fs).Dispose();
}
if (lastStreamingTrackModel != null)
{
bool trackExist = File.Exists(@lastStreamingTrackModelFilePath);
long trackFileSize = trackExist ? new FileInfo(@lastStreamingTrackModelFilePath).Length : 0;
if (trackExist)
{
if (trackFileSize != lastStreamingTrackModel.fileSize)
{
try
{
FileManager.Instance.DeleteFile(lastStreamingTrackModelFilePath);
}
catch (Exception e)
{
Debug.LogError($"Error while delete not fully TrackDownloadProc track error = {e.Message}, lastStreamingTrackModelFilePath = {lastStreamingTrackModelFilePath}");
MyCrashlytics.Instance.LogNonFatal(new Exception("ClipPlayer TrackDownloadProc Error"), $"error = {e.Message}", true);
}
}
else
{
lastStreamingTrackModel.waitingLoading = false;
lastStreamingTrackModel.waitingForDownloading = false;
lastStreamingTrackModel.assetBundlesLoading = false;
lastStreamingTrackModel.loading = false;
lastStreamingTrackModel.loaded = true;
lastStreamingTrackModel.cached = true;
}
}
else
{
lastStreamingTrackModel.waitingLoading = false;
lastStreamingTrackModel.waitingForDownloading = false;
lastStreamingTrackModel.loading = false;
lastStreamingTrackModel.loaded = false;
lastStreamingTrackModel.cached = false;
}
}
}
else
{
if (_trackLoadedData == null || _trackLoadedData.Length < length)
{
_trackLoadedData = new byte[length];
}
Marshal.Copy(buffer, _trackLoadedData, 0, length);
_fs.Write(_trackLoadedData, 0, length);
}
}
Before each play iteration i make
Bass.BASS_ChannelStop(streamHandle );
Bass.BASS_StreamFree(streamHandle );
Bass.BASS_ChannelStop(streamTempoFX);
Bass.BASS_StreamFree(streamTempoFX);
Also, i set _trackLoadedData = null before each iteration.
I noticed that crash on mobile happens, when click between tracks very fast, so seems that something can not get in time. For example, if i click very fast in Editor i got this error, but not crash
IOException: Invalid handle to path "pathToFile"
System.IO.FileStream.FlushBuffer () (at <599589bf4ce248909b8a14cbe4a2034e>:0)
System.IO.FileStream.WriteInternal (System.Byte[] src, System.Int32 offset, System.Int32 count) (at <599589bf4ce248909b8a14cbe4a2034e>:0)
System.IO.FileStream.Write (System.Byte[] array, System.Int32 offset, System.Int32 count) (at <599589bf4ce248909b8a14cbe4a2034e>:0)
or ObjectDisposedException: Cannot access a disposed object.
Object name: 'Stream has been closed'.
on this line
_fs.Write(_trackLoadedData, 0, length);
I call BASS_StreamCreateURL() in different thread, cause it main it stucks the UI.
_trackDownloadProc = new DOWNLOADPROC(TrackDownloadProc);
i tried in main and different thread, no matters.
So, i am curios what is going wrong. Unity IL2CPP bug(cause in Mono it works ok), or i doing something not safely. How should i properly handle multiple calls, i mean clean what i have to clean? =) My hunch is that, if i click play too fast between tracks that FileStream Write() continue use old, flushed file, so i need somehow quickly abort DOWNLOADPROC when click on new file. Thanks.