Ignore:
Timestamp:
Mar 27, 2020, 12:11:54 AM (5 years ago)
Author:
geyser
Message:

Fixed the export of 44.1 kHz sounds (a.k.a. "distorted zap sounds").

File:
1 edited

Legend:

Unmodified
Added
Removed
  • OniSplit/Sound/WavExporter.cs

    r1114 r1126  
    1414        private static readonly byte[] formatTemplate = new byte[50]
    1515        {
    16             0x02, 0, 0, 0, 0x22, 0x56, 0, 0, 0, 0, 0, 0, 0, 0x02, 0x04, 0,
    17             0x20, 0, 0xf4, 0x03, 0x07, 0, 0, 0x01, 0, 0, 0, 0x02, 0, 0xff, 0, 0, 0, 0, 0xc0, 0, 0x40, 0,
    18             0xf0, 0, 0, 0, 0xcc, 0x01, 0x30, 0xff, 0x88, 0x01, 0x18, 0xff
     16            0x02, 0,    // format ID (always 2)
     17            0, 0,       // ChannelCount (overwritten)
     18            0x22, 0x56, 0, 0, // SampleRate (usually 22050, can be 44100)
     19            0, 0, 0, 0, // average data rate (computed and overwritten)
     20            0, 0x02,    // block alignment (default 512, can be 1024)
     21            0x04, 0,    // bits per sample (always 4)
     22            0x20, 0,    // size of extended header block
     23            0xf4, 0x03, // samples per block (usually 1012, can be 2036)
     24            0x07, 0,    // standard ADPCM coefficient table (always the same)
     25            0, 0x01, 0, 0,
     26            0, 0x02, 0, 0xff,
     27            0, 0, 0, 0,
     28            0xc0, 0, 0x40, 0,
     29            0xf0, 0, 0, 0,
     30            0xcc, 0x01, 0x30, 0xff,
     31            0x88, 0x01, 0x18, 0xff
    1932        };
    2033
     
    3548                var format = (byte[])formatTemplate.Clone();
    3649
     50                var blockAlignment = 512 * sound.ChannelCount * sound.SampleRate / 22050;
     51                var samplesPerBlock = 2 + (blockAlignment - sound.ChannelCount * 7) * 8 / sound.ChannelCount / 4;
     52                var averageRate = sound.SampleRate * blockAlignment / samplesPerBlock;
    3753                Array.Copy(BitConverter.GetBytes(sound.ChannelCount), 0, format, 2, 2);
    38                 Array.Copy(BitConverter.GetBytes(sound.ChannelCount == 1 ? 11155 : 22311), 0, format, 8, 4);
    39                 Array.Copy(BitConverter.GetBytes(sound.ChannelCount == 1 ? 512 : 1024), 0, format, 12, 2);
     54                Array.Copy(BitConverter.GetBytes(sound.SampleRate), 0, format, 4, 4);
     55                Array.Copy(BitConverter.GetBytes(averageRate), 0, format, 8, 4);
     56                Array.Copy(BitConverter.GetBytes(blockAlignment), 0, format, 12, 2);
     57                Array.Copy(BitConverter.GetBytes(samplesPerBlock), 0, format, 18, 2);
    4058
    4159                writer.Write(fcc_RIFF);
Note: See TracChangeset for help on using the changeset viewer.