private static int WriteDsfFile(ref AudioData ad, string path)
        {
            int rv;
            var dsf = new WWDsfWriter();

            rv = dsf.EncodeInit(ad.meta);
            if (rv < 0) {
                return rv;
            }

            rv = dsf.EncodeSetPicture(ad.picture);
            if (rv < 0) {
                dsf.EncodeEnd();
                return rv;
            }

            for (int ch = 0; ch < ad.meta.channels; ++ch) {
                long lrv = dsf.EncodeAddPcm(ch, ad.pcm[ch].data);
                if (lrv < 0) {
                    dsf.EncodeEnd();
                    return (int)lrv;
                }
            }

            rv = dsf.EncodeRun(path);
            if (rv < 0) {
                dsf.EncodeEnd();
                return rv;
            }

            dsf.EncodeEnd();
            return 0;
        }