예제 #1
0
        private int sizeOfNode(FrameDataNode node)
        {
            var n = 0;

            if (node != null)
            {
                n  = 10;
                n += 1;
                switch (node.txt.enc)
                {
                default:
                    goto case 0;

                case 0:
                    n += node.txt.dim;
                    break;

                case 1:
                    n += node.txt.dim * 2;
                    break;
                }
            }

            return(n);
        }
예제 #2
0
 private void appendNode(ID3TagSpec tag, FrameDataNode node)
 {
     if (tag.v2_tail == null || tag.v2_head == null)
     {
         tag.v2_head = node;
         tag.v2_tail = node;
     }
     else
     {
         tag.v2_tail.nxt = node;
         tag.v2_tail     = node;
     }
 }
예제 #3
0
        private FrameDataNode findNode(ID3TagSpec tag, int frame_id, FrameDataNode last)
        {
            var node = last != null ? last.nxt : tag.v2_head;

            while (node != null)
            {
                if (node.fid == frame_id)
                {
                    return(node);
                }

                node = node.nxt;
            }

            return(null);
        }
예제 #4
0
        private bool isSameDescriptorUcs2(FrameDataNode node, string dsc)
        {
            if (node.dsc.enc != 1 && node.dsc.dim > 0)
            {
                return(false);
            }

            for (var i = 0; i < node.dsc.dim; ++i)
            {
                if (null == dsc || node.dsc.l[i] != dsc[i])
                {
                    return(false);
                }
            }

            return(true);
        }
예제 #5
0
        private void id3v2_add_latin1(LameGlobalFlags gfp, int frame_id, string lang, string desc, string text)
        {
            var gfc = gfp.internal_flags;

            if (gfc != null)
            {
                FrameDataNode node;
                node = findNode(gfc.tag_spec, frame_id, null);
                if (isMultiFrame(frame_id))
                {
                    while (node != null)
                    {
                        if (isSameLang(node.lng, lang))
                        {
                            if (isSameDescriptor(node, desc))
                            {
                                break;
                            }
                        }

                        node = findNode(gfc.tag_spec, frame_id, node);
                    }
                }

                if (node == null)
                {
                    node = new FrameDataNode();
                    appendNode(gfc.tag_spec, node);
                }

                node.fid            = frame_id;
                node.lng            = setLang(lang);
                node.dsc.l          = desc;
                node.dsc.dim        = !ReferenceEquals(desc, null) ? desc.Length : 0;
                node.dsc.enc        = 0;
                node.txt.l          = text;
                node.txt.dim        = !ReferenceEquals(text, null) ? text.Length : 0;
                node.txt.enc        = 0;
                gfc.tag_spec.flags |= CHANGED_FLAG | ADD_V2_FLAG;
            }
        }
예제 #6
0
        private int set_frame_comment(sbyte[] frame, int framePos, FrameDataNode node)
        {
            var n = sizeOfCommentNode(node);

            if (n > 10)
            {
                framePos          = set_4_byte_value(frame, framePos, ID_COMMENT);
                framePos          = set_4_byte_value(frame, framePos, n - 10);
                frame[framePos++] = 0;
                frame[framePos++] = 0;
                frame[framePos++] = node.txt.enc == 1 ? (sbyte)1 : (sbyte)0;
                frame[framePos++] = (sbyte)node.lng[0];
                frame[framePos++] = (sbyte)node.lng[1];
                frame[framePos++] = (sbyte)node.lng[2];
                if (node.dsc.enc != 1)
                {
                    framePos          = writeChars(frame, framePos, node.dsc.l, 0, node.dsc.dim);
                    frame[framePos++] = 0;
                }
                else
                {
                    framePos          = writeUcs2s(frame, framePos, node.dsc.l, 0, node.dsc.dim);
                    frame[framePos++] = 0;
                    frame[framePos++] = 0;
                }

                if (node.txt.enc != 1)
                {
                    framePos = writeChars(frame, framePos, node.txt.l, 0, node.txt.dim);
                }
                else
                {
                    framePos = writeUcs2s(frame, framePos, node.txt.l, 0, node.txt.dim);
                }
            }

            return(framePos);
        }
예제 #7
0
        private int set_frame_custom2(sbyte[] frame, int framePos, FrameDataNode node)
        {
            var n = sizeOfNode(node);

            if (n > 10)
            {
                framePos          = set_4_byte_value(frame, framePos, node.fid);
                framePos          = set_4_byte_value(frame, framePos, n - 10);
                frame[framePos++] = 0;
                frame[framePos++] = 0;
                frame[framePos++] = node.txt.enc == 1 ? (sbyte)1 : (sbyte)0;
                if (node.txt.enc != 1)
                {
                    framePos = writeChars(frame, framePos, node.txt.l, 0, node.txt.dim);
                }
                else
                {
                    framePos = writeUcs2s(frame, framePos, node.txt.l, 0, node.txt.dim);
                }
            }

            return(framePos);
        }