Beispiel #1
0
        /// <summary>
        /// Determines whether two specified <see cref="MidiChunk"/> objects have the same content.
        /// </summary>
        /// <param name="chunk1">The first chunk to compare, or null.</param>
        /// <param name="chunk2">The second chunk to compare, or null.</param>
        /// <returns>true if the <paramref name="chunk1"/> is equal to the <paramref name="chunk2"/>;
        /// otherwise, false.</returns>
        public static bool Equals(MidiChunk chunk1, MidiChunk chunk2)
        {
            string message;

            return(Equals(chunk1, chunk2, out message));
        }
Beispiel #2
0
 /// <summary>
 /// Determines whether two specified <see cref="MidiChunk"/> objects have the same content using
 /// the specified comparison settings.
 /// </summary>
 /// <param name="chunk1">The first chunk to compare, or null.</param>
 /// <param name="chunk2">The second chunk to compare, or null.</param>
 /// <param name="settings">Settings according to which chunks should be compared.</param>
 /// <param name="message">Message containing information about what exactly is different in
 /// <paramref name="chunk1"/> and <paramref name="chunk2"/>.</param>
 /// <returns>true if the <paramref name="chunk1"/> is equal to the <paramref name="chunk2"/>;
 /// otherwise, false.</returns>
 public static bool Equals(MidiChunk chunk1, MidiChunk chunk2, MidiChunkEqualityCheckSettings settings, out string message)
 {
     return(MidiChunkEquality.Equals(chunk1, chunk2, settings ?? new MidiChunkEqualityCheckSettings(), out message));
 }
Beispiel #3
0
        /// <summary>
        /// Reads a chunk from a MIDI-file.
        /// </summary>
        /// <param name="reader">Reader to read a chunk with.</param>
        /// <param name="settings">Settings according to which a chunk must be read.</param>
        /// <param name="actualTrackChunksCount">Actual count of track chunks at the moment.</param>
        /// <param name="expectedTrackChunksCount">Expected count of track chunks.</param>
        /// <returns>A MIDI-file chunk.</returns>
        /// <exception cref="ObjectDisposedException">Method was called after the reader was disposed.</exception>
        /// <exception cref="IOException">An I/O error occurred on the underlying stream.</exception>
        /// <exception cref="UnknownChunkException">Chunk to be read has unknown ID and that
        /// should be treated as error accordng to the specified <paramref name="settings"/>.</exception>
        /// <exception cref="UnexpectedTrackChunksCountException">Actual track chunks
        /// count is greater than expected one and that should be treated as error according to
        /// the specified <paramref name="settings"/>.</exception>
        /// <exception cref="InvalidChunkSizeException">Actual chunk's size differs from the one declared
        /// in its header and that should be treated as error according to the specified
        /// <paramref name="settings"/>.</exception>
        /// <exception cref="UnknownChannelEventException">Reader has encountered an unknown channel event.</exception>
        /// <exception cref="NotEnoughBytesException">Value cannot be read since the reader's underlying stream
        /// doesn't have enough bytes.</exception>
        /// <exception cref="UnexpectedRunningStatusException">Unexpected running status is encountered.</exception>
        /// <exception cref="MissedEndOfTrackEventException">Track chunk doesn't end with End Of Track event and that
        /// should be treated as error accordng to the specified <paramref name="settings"/>.</exception>
        /// <exception cref="InvalidChannelEventParameterValueException">Value of a channel event's parameter
        /// just read is invalid.</exception>
        /// <exception cref="InvalidMetaEventParameterValueException">Value of a meta event's parameter
        /// just read is invalid.</exception>
        private static MidiChunk ReadChunk(MidiReader reader, ReadingSettings settings, int actualTrackChunksCount, int?expectedTrackChunksCount)
        {
            MidiChunk chunk = null;

            try
            {
                var chunkId = reader.ReadString(MidiChunk.IdLength);
                if (chunkId.Length < MidiChunk.IdLength)
                {
                    switch (settings.NotEnoughBytesPolicy)
                    {
                    case NotEnoughBytesPolicy.Abort:
                        throw new NotEnoughBytesException("Chunk ID cannot be read since the reader's underlying stream doesn't have enough bytes.",
                                                          MidiChunk.IdLength,
                                                          chunkId.Length);

                    case NotEnoughBytesPolicy.Ignore:
                        return(null);
                    }
                }

                //

                switch (chunkId)
                {
                case HeaderChunk.Id:
                    chunk = new HeaderChunk();
                    break;

                case TrackChunk.Id:
                    chunk = new TrackChunk();
                    break;

                default:
                    chunk = TryCreateChunk(chunkId, settings.CustomChunkTypes);
                    break;
                }

                //

                if (chunk == null)
                {
                    switch (settings.UnknownChunkIdPolicy)
                    {
                    case UnknownChunkIdPolicy.ReadAsUnknownChunk:
                        chunk = new UnknownChunk(chunkId);
                        break;

                    case UnknownChunkIdPolicy.Skip:
                        var size = reader.ReadDword();
                        reader.Position += size;
                        return(null);

                    case UnknownChunkIdPolicy.Abort:
                        throw new UnknownChunkException($"'{chunkId}' chunk ID is unknown.", chunkId);
                    }
                }

                //

                if (chunk is TrackChunk && expectedTrackChunksCount != null && actualTrackChunksCount >= expectedTrackChunksCount)
                {
                    ReactOnUnexpectedTrackChunksCount(settings.UnexpectedTrackChunksCountPolicy, actualTrackChunksCount, expectedTrackChunksCount.Value);

                    switch (settings.ExtraTrackChunkPolicy)
                    {
                    case ExtraTrackChunkPolicy.Read:
                        break;

                    case ExtraTrackChunkPolicy.Skip:
                        var size = reader.ReadDword();
                        reader.Position += size;
                        return(null);
                    }
                }

                //

                chunk.Read(reader, settings);
            }
            catch (NotEnoughBytesException ex)
            {
                ReactOnNotEnoughBytes(settings.NotEnoughBytesPolicy, ex);
            }
            catch (EndOfStreamException ex)
            {
                ReactOnNotEnoughBytes(settings.NotEnoughBytesPolicy, ex);
            }

            return(chunk);
        }
Beispiel #4
0
 /// <summary>
 /// Determines whether two specified <see cref="MidiChunk"/> objects have the same content.
 /// </summary>
 /// <param name="chunk1">The first chunk to compare, or null.</param>
 /// <param name="chunk2">The second chunk to compare, or null.</param>
 /// <param name="message">Message containing information about what exactly is different in
 /// <paramref name="chunk1"/> and <paramref name="chunk2"/>.</param>
 /// <returns>true if the <paramref name="chunk1"/> is equal to the <paramref name="chunk2"/>;
 /// otherwise, false.</returns>
 public static bool Equals(MidiChunk chunk1, MidiChunk chunk2, out string message)
 {
     return(Equals(chunk1, chunk2, null, out message));
 }
Beispiel #5
0
        /// <summary>
        /// Determines whether two specified <see cref="MidiChunk"/> objects have the same content.
        /// </summary>
        /// <param name="chunk1">The first chunk to compare, or <c>null</c>.</param>
        /// <param name="chunk2">The second chunk to compare, or <c>null</c>.</param>
        /// <param name="settings">Settings according to which chunks should be compared.</param>
        /// <returns><c>true</c> if the <paramref name="chunk1"/> is equal to the <paramref name="chunk2"/>;
        /// otherwise, <c>false</c>.</returns>
        public static bool Equals(MidiChunk chunk1, MidiChunk chunk2, MidiChunkEqualityCheckSettings settings)
        {
            string message;

            return(Equals(chunk1, chunk2, settings, out message));
        }