Allow multiple threads simultaneous access to Acinerella - should fix

freezes and lags on the song selection screen (fixes #167)
This commit is contained in:
lukeIam committed 2015-12-18 19:15:05 +01:00
1 parent 3e341c2475
commit 0bcc7779b8
1 file changed
+32 -13
+32 -13
View File
@@ -16,6 +16,7 @@
#endregion
using System;
using System.Collections.Generic;
using System.Runtime.InteropServices;
namespace Vocaluxe.Lib.Video.Acinerella
@@ -191,6 +192,20 @@ namespace Vocaluxe.Lib.Video.Acinerella
#endif
private static readonly Object _Lock = new Object();
private static readonly Dictionary<Int64, object> _AcInstanceLocks = new Dictionary<Int64, object>(20);
private static object _GetLockToken(IntPtr pAcDecoder)
{
object l = null;
_AcInstanceLocks.TryGetValue(pAcDecoder.ToInt64(), out l);
if (l == null)
{
l = new object();
_AcInstanceLocks.Add(pAcDecoder.ToInt64(), l);
}
return l;
}
// Defines the type of an Acinerella media stream. Currently only video and
// audio streams are supported, subtitle and data streams will be marked as
@@ -216,7 +231,7 @@ namespace Vocaluxe.Lib.Video.Acinerella
public static void AcFree(IntPtr pAcInstance)
{
lock (_Lock)
lock (_GetLockToken(pAcInstance))
{
_ac_free(pAcInstance);
}
@@ -261,7 +276,7 @@ namespace Vocaluxe.Lib.Video.Acinerella
IntPtr proberesult
)
{
lock (_lock)
lock (_GetLockToken(pAcDecoder))
{
return _ac_open(PAc_instance, sender, open_proc, read_proc, seek_proc, close_proc, proberesult);
}
@@ -274,7 +289,7 @@ namespace Vocaluxe.Lib.Video.Acinerella
public static Int32 AcOpen2(IntPtr pAcInstance, string filename)
// ReSharper restore UnusedMethodReturnValue.Global
{
lock (_Lock)
lock (_GetLockToken(pAcInstance))
{
return _ac_open2(pAcInstance, filename);
}
@@ -287,7 +302,7 @@ namespace Vocaluxe.Lib.Video.Acinerella
public static void AcClose(IntPtr pAcInstance)
{
lock (_Lock)
lock (_GetLockToken(pAcInstance))
{
_ac_close(pAcInstance);
}
@@ -300,7 +315,7 @@ namespace Vocaluxe.Lib.Video.Acinerella
public static void AcGetStreamInfo(IntPtr pAcInstance, Int32 nb, out SACStreamInfo info)
{
lock (_Lock)
lock (_GetLockToken(pAcInstance))
{
_ac_get_stream_info(pAcInstance, nb, out info);
}
@@ -321,7 +336,7 @@ namespace Vocaluxe.Lib.Video.Acinerella
public static IntPtr AcCreateVideoDecoder(IntPtr pAcInstance)
{
lock (_Lock)
lock (_GetLockToken(pAcInstance))
{
return _ac_create_video_decoder(pAcInstance);
}
@@ -332,7 +347,7 @@ namespace Vocaluxe.Lib.Video.Acinerella
public static IntPtr AcCreateAudioDecoder(IntPtr pAcInstance)
{
lock (_Lock)
lock (_GetLockToken(pAcInstance))
{
return _ac_create_audio_decoder(pAcInstance);
}
@@ -347,8 +362,12 @@ namespace Vocaluxe.Lib.Video.Acinerella
{
lock (_Lock)
{
_ac_free_decoder(pAcDecoder);
lock (_GetLockToken(pAcDecoder))
{
_ac_free_decoder(pAcDecoder);
}
}
}
// Decodes a package using the specified decoder. The decodec data is stored in the
@@ -359,7 +378,7 @@ namespace Vocaluxe.Lib.Video.Acinerella
public static bool AcDecodePackage(IntPtr pAcPackage, IntPtr pAcDecoder)
{
lock (_Lock)
lock (_GetLockToken(pAcDecoder))
{
return _ac_decode_package(pAcPackage, pAcDecoder) != 0;
}
@@ -370,7 +389,7 @@ namespace Vocaluxe.Lib.Video.Acinerella
public static bool AcGetAudioFrame(IntPtr pAcInstance, IntPtr pAcDecoder)
{
lock (_Lock)
lock (_GetLockToken(pAcDecoder))
{
return _ac_get_audio_frame(pAcInstance, pAcDecoder) != 0;
}
@@ -381,7 +400,7 @@ namespace Vocaluxe.Lib.Video.Acinerella
public static bool AcGetFrame(IntPtr pAcInstance, IntPtr pAcDecoder)
{
lock (_Lock)
lock (_GetLockToken(pAcDecoder))
{
return _ac_get_frame(pAcInstance, pAcDecoder) != 0;
}
@@ -392,7 +411,7 @@ namespace Vocaluxe.Lib.Video.Acinerella
public static bool AcSkipFrames(IntPtr pAcInstance, IntPtr pAcDecoder, Int32 num)
{
lock (_Lock)
lock (_GetLockToken(pAcDecoder))
{
return _ac_skip_frames(pAcInstance, pAcDecoder, num) != 0;
}
@@ -408,7 +427,7 @@ namespace Vocaluxe.Lib.Video.Acinerella
public static bool AcSeek(IntPtr pAcDecoder, Int32 dir, Int64 targetPos)
{
lock (_Lock)
lock (_GetLockToken(pAcDecoder))
{
return _ac_seek(pAcDecoder, dir, targetPos) != 0;
}