예제 #1
0
        /// <summary>
        /// WAVファイルのヘッダ部分を読み込む。
        /// </summary>
        /// <returns>読めたらtrue</returns>
        private bool ReadWavFileHeader(string path)
        {
            bool result = false;
            var  pd     = new PcmData();

            var wavR = new WavReader();

            using (BinaryReader br = new BinaryReader(File.Open(path, FileMode.Open, FileAccess.Read, FileShare.Read))) {
                if (wavR.ReadHeader(br))
                {
                    // WAVヘッダ読み込み成功。PcmDataを作って再生リストに足す。

                    pd.SetFormat(wavR.NumChannels, wavR.BitsPerSample, wavR.ValidBitsPerSample,
                                 (int)wavR.SampleRate, wavR.SampleValueRepresentationType, wavR.NumFrames);

                    if (wavR.SampleDataType == WavReader.DataType.DoP)
                    {
                        pd.SampleDataType = PcmData.DataType.DoP;
                    }

                    if ("RIFFINFO_INAM".Equals(wavR.Title) &&
                        "RIFFINFO_IART".Equals(wavR.ArtistName))
                    {
                        // Issue 79 workaround
                    }
                    else
                    {
                        if (wavR.Title != null)
                        {
                            pd.DisplayName = wavR.Title;
                        }
                        if (wavR.AlbumName != null)
                        {
                            pd.AlbumTitle = wavR.AlbumName;
                        }
                        if (wavR.ArtistName != null)
                        {
                            pd.ArtistName = wavR.ArtistName;
                        }
                        if (wavR.ComposerName != null)
                        {
                            pd.ComposerName = wavR.ComposerName;
                        }
                    }
                    pd.SetPicture(wavR.PictureBytes, wavR.PictureData);
                    result = CheckAddPcmData(path, pd, true);
                }
                else
                {
                    LoadErrorMessageAdd(string.Format(CultureInfo.InvariantCulture, Properties.Resources.ReadFileFailed + ": {1} : {2}{3}",
                                                      "WAV", path, wavR.ErrorReason, Environment.NewLine));
                }
            }

            return(result);
        }
예제 #2
0
        public string ReadHeader(BinaryReader br, out PcmData pcmData)
        {
            pcmData = new PcmData();

            ResultType result = ReadFormChunkHeader(br);

            if (result != ResultType.Success)
            {
                mSB.Append(string.Format("Error: Form Chunkチャンクの読み込み失敗。{0}\r\n", result));
                return(mSB.ToString());
            }

            if (mIsAIFC)
            {
                // AIFCの場合、FVERチャンクが来る(required)
                result = ReadFverChunk(br);
                if (ResultType.Success != result)
                {
                    mSB.Append(string.Format("Error: AIFC FVERチャンクのエラー。{0}\r\n", result));
                    return(mSB.ToString());
                }
            }

            result = ReadCommonChunk(br);
            if (ResultType.Success != result)
            {
                mSB.Append(string.Format("Error: COMMチャンクのエラー。{0}\r\n", result));
                return(mSB.ToString());
            }

            result = ReadSoundDataChunk(br);
            if (ResultType.Success != result)
            {
                mSB.Append(string.Format("Error: SSNDチャンクのエラー。{0}\r\n", result));
                return(mSB.ToString());
            }

            if (16 != BitsPerSample &&
                24 != BitsPerSample)
            {
                mSB.Append(string.Format("Info: 量子化ビット数がエキゾチックです。{0} bit\r\n", BitsPerSample));
                return(mSB.ToString());
            }

            pcmData.SetFormat(
                NumChannels,
                BitsPerSample,
                BitsPerSample,
                SampleRate,
                PcmData.ValueRepresentationType.SInt,
                NumFrames);

            result = ReadID3Chunk(br);
            switch (result)
            {
            case ResultType.NotFoundID3Header:
                // ID3ヘッダーが無い。
                break;

            case ResultType.Success:
                // ID3読み込み成功
                pcmData.DisplayName  = TitleName;
                pcmData.AlbumTitle   = AlbumName;
                pcmData.ArtistName   = ArtistName;
                pcmData.ComposerName = Composer;
                if (0 < PictureBytes)
                {
                    pcmData.SetPicture(PictureBytes, PictureData);
                }
                mSB.Append(string.Format("    TitleName={0}\r\n", TitleName));
                mSB.Append(string.Format("    AlbumName={0}\r\n", AlbumName));
                mSB.Append(string.Format("    ArtistName={0}\r\n", ArtistName));
                mSB.Append(string.Format("    Composer={0}\r\n", Composer));
                mSB.Append(string.Format("    ID3チャンク読み込み終了。\r\n"));
                break;

            default:
                mSB.Append(string.Format("Error: ID3チャンクのエラー。{0}\r\n", result));
                return(mSB.ToString());
            }

            mSB.Append("正常終了。\r\n");

            return(mSB.ToString());
        }