Ejemplo n.º 1
0
        public static void Merge(AudioFrame outFrame, params AudioFrame[] inFrames)
        {
            if (inFrames.Length == 0)
            {
                return;
            }
            var format = inFrames[0].format;

            for (int i = 1; i < inFrames.Length; i++)
            {
                if (format != inFrames[i].format)
                {
                    throw new ArgumentException($"{nameof(inFrames)}的所有元素的{nameof(Format)}必须一致", nameof(inFrames));
                }
            }

            int outSampleCount = inFrames.Sum(frame => frame.sampleCount);

            outFrame.format = format;
            outFrame.Resize(outSampleCount);

            int offset = 0;

            for (int i = 0; i < inFrames.Length; i++)
            {
                FF.av_samples_copy(outFrame.datas, inFrames[i].datas, offset, 0, inFrames[i].sampleCount, format.Channels, format.SampleFormat);
                offset += inFrames[i].sampleCount;
            }
        }
Ejemplo n.º 2
0
        internal override void UpdateFromNative()
        {
            int sampleCount = frame->NbSamples;

            Resize(sampleCount);
            FF.av_samples_copy(datas, (IntPtr *)frame->ExtendedData, 0, 0, sampleCount, format.Channels, format.SampleFormat);
        }
Ejemplo n.º 3
0
 public void CopyToNoResize(int srcSampleOffset, int srcSampleCount, AudioFrame dstFrame, int dstSampleOffset = 0)
 {
     if (dstFrame.format != format)
     {
         throw new ArgumentException("目标帧格式不一致", nameof(dstFrame));
     }
     FF.av_samples_copy(dstFrame.datas, datas, dstSampleOffset, srcSampleOffset, srcSampleCount, format.Channels, format.SampleFormat);
 }
Ejemplo n.º 4
0
 public void Update(int sampleCount, params IntPtr[] newDatas)
 {
     if (newDatas.Length != format.LineCount)
     {
         throw new ArgumentException("参数个数和数据行数不一致", nameof(newDatas));
     }
     Resize(sampleCount);
     FF.av_samples_copy(datas, newDatas, 0, 0, sampleCount, format.Channels, format.SampleFormat);
 }
Ejemplo n.º 5
0
 public void Update(int sampleCount, IntPtr newData)
 {
     if (format.LineCount != 1)
     {
         throw new ArgumentException($"该{nameof(AudioFrame)}对象拥有大于1的数据行数,因此不能调用此方法", nameof(newData));
     }
     Resize(sampleCount);
     FF.av_samples_copy(datas, &newData, 0, 0, sampleCount, format.Channels, format.SampleFormat);
 }
Ejemplo n.º 6
0
        public void Update <T>(int sampleCount, params T *[] newDatas) where T : unmanaged
        {
            if (newDatas.Length != format.LineCount)
            {
                throw new ArgumentException("数组个数和数据行数不一致", nameof(newDatas));
            }
            Resize(sampleCount);

            fixed(T **p = newDatas)
            {
                FF.av_samples_copy(datas, (IntPtr *)p, 0, 0, sampleCount, format.Channels, format.SampleFormat);
            }
        }
Ejemplo n.º 7
0
        public void Update <T>(int sampleCount, ReadOnlySpan <T> newData1, ReadOnlySpan <T> newData2) where T : unmanaged
        {
            if (2 != format.LineCount)
            {
                throw new InvalidOperationException($"{nameof(Format)}的数据行数必须是2才能调用此方法");
            }
            Resize(sampleCount);

            fixed(T *p1 = newData1)
            fixed(T * p2 = newData2)
            {
                T **srcPointers = stackalloc[] { p1, p2 };

                FF.av_samples_copy(datas, (IntPtr *)srcPointers, 0, 0, sampleCount, format.Channels, format.SampleFormat);
            }
        }
Ejemplo n.º 8
0
        public void Update <T>(int sampleCount, ReadOnlySpan <T> newData1, ReadOnlySpan <T> newData2, ReadOnlySpan <T> newData3, ReadOnlySpan <T> newData4, ReadOnlySpan <T> newData5, ReadOnlySpan <T> newData6, ReadOnlySpan <T> newData7) where T : unmanaged
        {
            if (7 != format.LineCount)
            {
                throw new InvalidOperationException($"{nameof(Format)}的数据行数必须是7才能调用此方法");
            }
            Resize(sampleCount);

            fixed(T *p1 = newData1)
            fixed(T * p2 = newData2)
            fixed(T * p3 = newData3)
            fixed(T * p4 = newData4)
            fixed(T * p5 = newData5)
            fixed(T * p6 = newData6)
            fixed(T * p7 = newData7)
            {
                T **srcPointers = stackalloc[] { p1, p2, p3, p4, p5, p6, p7 };

                FF.av_samples_copy(datas, (IntPtr *)srcPointers, 0, 0, sampleCount, format.Channels, format.SampleFormat);
            }
        }
Ejemplo n.º 9
0
 public void CopyTo(int srcSampleOffset, int srcSampleCount, AudioFrame dstFrame)
 {
     dstFrame.Resize(format, srcSampleCount);
     FF.av_samples_copy(dstFrame.datas, datas, 0, srcSampleOffset, srcSampleCount, format.Channels, format.SampleFormat);
 }