天下之事,必先处之难,而后易之。

C# 内存复制和数组复制示例

内存复制-Marshal.Copy:

 // 复制当前传入的数据
 byte[] pcm_src = new byte[len];
 // 复制数据到二进制数组
 Marshal.Copy(pcm, pcm_src, 0, len);

数组复制-Array.Copy:

// 复制当前传入的数据
byte[] pcm_src = new byte[len];
// 复制数据到二进制数组
Marshal.Copy(pcm, pcm_src, 0, len);
// 复制新传入的数据到新的数组结构
Array.Copy(pcm_src, 0, pcm_dest, bts_left.Length, len)

测试示例:

        // 采样数
        ushort samples = 320;

        // 上次剩余的字节
        byte[] bts_left;

        class aa
        {
            public byte[] pcm;
            public int len;
        }

        private List<aa> data = new List<aa>();
    
        public void PlayAudio(IntPtr pcm, int len)
        {
            lock (this)
            {
                int samples_len = samples * 2;

                if (len == samples_len)
                {
                    byte[] bts = new byte[len];
                    Marshal.Copy(pcm, bts, 0, len);
                    data.Add(new aa
                    {
                        len = len,
                        pcm = bts
                    });
                }
                else
                // 此处解决采样数为1024时分割可以复制数据的大小
                {
                    var len_temp = bts_left ==null? len : len + bts_left.Length;

                    byte[] pcm_dest = new byte[len_temp];
                    byte[] bts = new byte[samples_len];
                    // 复制数据
                    if (bts_left != null)
                    {
                        // 复制长度不够的数据
                        Array.Copy(bts_left,0, pcm_dest, 0, bts_left.Length);
                        // 复制当前传入的数据
                        byte[] pcm_src = new byte[len];
                        // 复制数据到二进制数组
                        Marshal.Copy(pcm, pcm_src, 0, len);
                        // 复制新传入的数据到新的数组结构
                        Array.Copy(pcm_src, 0, pcm_dest, bts_left.Length, len);
                       
                        bts_left = null;
                    }
                    else
                    {
                        Marshal.Copy(pcm, pcm_dest, 0, len_temp);
                    }
                    // 获取播放数据
                    int index = 0,count= len_temp / samples_len;
                    int startIndex=0;
                    Console.WriteLine(">>>total:"+ len_temp + ",times:" + count + ",left:" + len_temp % samples_len);
                    while (index< count)
                    {
                        // 复制满足长度的数据
                        Array.Copy(pcm_dest, startIndex, bts, 0, samples_len);
                        // 添加数据
                        data.Add(new aa
                        {
                            len = samples_len,
                            pcm = bts
                        });
                        index++;
                        // 计算下一次的开始位置
                        startIndex = index * samples_len; 
                    }
                    // 暂存长度不够的数据
                    var left_len = len_temp % samples_len;
                    if (left_len > 0)
                    {
                        bts_left = new byte[left_len];
                        // 复制不够长度的数据
                        Array.Copy(pcm_dest, startIndex, bts_left, 0, left_len);
                    }
                }
            }

            //SDL.SDL_Delay(10);
        }

posted @ 2024-09-20 18:37  boonya  阅读(92)  评论(0)    收藏  举报  来源
我有佳人隔窗而居,今有伊人明月之畔。
轻歌柔情冰壶之浣,涓涓清流梦入云端。
美人如娇温雅悠婉,目遇赏阅适而自欣。
百草层叠疏而有致,此情此思怀彼佳人。
念所思之唯心叩之,踽踽彳亍寤寐思之。
行云如风逝而复归,佳人一去莫知可回?
深闺冷瘦独自徘徊,处处明灯影还如只。
推窗见月疑是归人,阑珊灯火托手思忖。
庐居闲客而好品茗,斟茶徐徐漫漫生烟。

我有佳人在水之畔,瓮载渔舟浣纱归还。
明月相照月色还低,浅近芦苇深深如钿。
庐山秋月如美人衣,画堂春阁香气靡靡。
秋意幽笃残粉摇曳,轻轻如诉画中蝴蝶。
泾水潺潺取尔浇园,暮色黄昏如沐佳人。
青丝撩弄长裙翩翩,彩蝶飞舞执子手腕。
香带丝缕缓缓在肩,柔美体肤寸寸爱怜。
如水之殇美玉成欢,我有佳人清新如兰。
伊人在水我在一边,远远相望不可亵玩。