mirror of
https://github.com/claunia/cuetools.net.git
synced 2025-12-16 10:04:24 +00:00
143 lines
4.3 KiB
C#
143 lines
4.3 KiB
C#
using System;
|
|
|
|
namespace CUETools.Codecs
|
|
{
|
|
public class AudioSamples
|
|
{
|
|
public const uint UINT32_MAX = 0xffffffff;
|
|
|
|
unsafe public static void Interlace(int* res, int* src1, int* src2, int n)
|
|
{
|
|
for (int i = n; i > 0; i--)
|
|
{
|
|
*(res++) = *(src1++);
|
|
*(res++) = *(src2++);
|
|
}
|
|
}
|
|
|
|
unsafe public static void Deinterlace(int* dst1, int* dst2, int* src, int n)
|
|
{
|
|
for (int i = n; i > 0; i--)
|
|
{
|
|
*(dst1++) = *(src++);
|
|
*(dst2++) = *(src++);
|
|
}
|
|
}
|
|
|
|
unsafe public static bool MemCmp(int* res, int* smp, int n)
|
|
{
|
|
for (int i = n; i > 0; i--)
|
|
if (*(res++) != *(smp++))
|
|
return true;
|
|
return false;
|
|
}
|
|
|
|
unsafe public static void MemCpy(uint* res, uint* smp, int n)
|
|
{
|
|
for (int i = n; i > 0; i--)
|
|
*(res++) = *(smp++);
|
|
}
|
|
|
|
unsafe public static void MemCpy(int* res, int* smp, int n)
|
|
{
|
|
for (int i = n; i > 0; i--)
|
|
*(res++) = *(smp++);
|
|
}
|
|
|
|
unsafe public static void MemCpy(long* res, long* smp, int n)
|
|
{
|
|
for (int i = n; i > 0; i--)
|
|
*(res++) = *(smp++);
|
|
}
|
|
|
|
unsafe public static void MemCpy(short* res, short* smp, int n)
|
|
{
|
|
for (int i = n; i > 0; i--)
|
|
*(res++) = *(smp++);
|
|
}
|
|
|
|
unsafe public static void MemCpy(byte* res, byte* smp, int n)
|
|
{
|
|
if ((((IntPtr)smp).ToInt64() & 7) == (((IntPtr)res).ToInt64() & 7) && n > 32)
|
|
{
|
|
int delta = (int)((8 - (((IntPtr)smp).ToInt64() & 7)) & 7);
|
|
for (int i = delta; i > 0; i--)
|
|
*(res++) = *(smp++);
|
|
n -= delta;
|
|
|
|
MemCpy((long*)res, (long*)smp, n >> 3);
|
|
int n8 = (n >> 3) << 3;
|
|
n -= n8;
|
|
smp += n8;
|
|
res += n8;
|
|
}
|
|
if ((((IntPtr)smp).ToInt64() & 3) == (((IntPtr)res).ToInt64() & 3) && n > 16)
|
|
{
|
|
int delta = (int)((4 - (((IntPtr)smp).ToInt64() & 3)) & 3);
|
|
for (int i = delta; i > 0; i--)
|
|
*(res++) = *(smp++);
|
|
n -= delta;
|
|
|
|
MemCpy((int*)res, (int*)smp, n >> 2);
|
|
int n4 = (n >> 2) << 2;
|
|
n -= n4;
|
|
smp += n4;
|
|
res += n4;
|
|
}
|
|
for (int i = n; i > 0; i--)
|
|
*(res++) = *(smp++);
|
|
}
|
|
|
|
unsafe public static void MemSet(int* res, int smp, int n)
|
|
{
|
|
for (int i = n; i > 0; i--)
|
|
*(res++) = smp;
|
|
}
|
|
|
|
unsafe public static void MemSet(long* res, long smp, int n)
|
|
{
|
|
for (int i = n; i > 0; i--)
|
|
*(res++) = smp;
|
|
}
|
|
|
|
unsafe public static void MemSet(byte* res, byte smp, int n)
|
|
{
|
|
if (IntPtr.Size == 8 && (((IntPtr)res).ToInt64() & 7) == 0 && smp == 0 && n > 8)
|
|
{
|
|
MemSet((long*)res, 0, n >> 3);
|
|
int n8 = (n >> 3) << 3;
|
|
n -= n8;
|
|
res += n8;
|
|
}
|
|
if ((((IntPtr)res).ToInt64() & 3) == 0 && smp == 0 && n > 4)
|
|
{
|
|
MemSet((int*)res, 0, n >> 2);
|
|
int n4 = (n >> 2) << 2;
|
|
n -= n4;
|
|
res += n4;
|
|
}
|
|
for (int i = n; i > 0; i--)
|
|
*(res++) = smp;
|
|
}
|
|
|
|
unsafe public static void MemSet(byte[] res, byte smp, int offs, int n)
|
|
{
|
|
fixed (byte* pres = &res[offs])
|
|
MemSet(pres, smp, n);
|
|
}
|
|
|
|
unsafe public static void MemSet(int[] res, int smp, int offs, int n)
|
|
{
|
|
fixed (int* pres = &res[offs])
|
|
MemSet(pres, smp, n);
|
|
}
|
|
|
|
unsafe public static void MemSet(long[] res, long smp, int offs, int n)
|
|
{
|
|
fixed (long* pres = &res[offs])
|
|
MemSet(pres, smp, n);
|
|
}
|
|
}
|
|
|
|
}
|