Exemplo n.º 1
0
        private int aiff_check2(IFF_AIFF pcm_aiff_data)
        {
            if (pcm_aiff_data.sampleType != IFF_ID_SSND)
            {
                return(1);
            }

            switch (pcm_aiff_data.sampleSize)
            {
            case 32:
            case 24:
            case 16:
            case 8:
                break;

            default:
                return(1);
            }

            if (pcm_aiff_data.numChannels != 1 && pcm_aiff_data.numChannels != 2)
            {
                return(1);
            }

            if (pcm_aiff_data.blkAlgn.blockSize != 0)
            {
                return(1);
            }

            return(0);
        }
Exemplo n.º 2
0
        private int aiff_check2(IFF_AIFF pcm_aiff_data)
        {
            if (pcm_aiff_data.sampleType != IFF_ID_SSND)
            {
                if (parse.silent < 10)
                {
                    Console.WriteLine("ERROR: input sound data is not PCM\n");
                }

                return(1);
            }

            switch (pcm_aiff_data.sampleSize)
            {
            case 32:
            case 24:
            case 16:
            case 8:
                break;

            default:
                if (parse.silent < 10)
                {
                    Console.WriteLine("ERROR: input sound data is not 8, 16, 24 or 32 bits\n");
                }

                return(1);
            }

            if (pcm_aiff_data.numChannels != 1 && pcm_aiff_data.numChannels != 2)
            {
                if (parse.silent < 10)
                {
                    Console.WriteLine("ERROR: input sound data is not mono or stereo\n");
                }

                return(1);
            }

            if (pcm_aiff_data.blkAlgn.blockSize != 0)
            {
                if (parse.silent < 10)
                {
                    Console.WriteLine("ERROR: block size of input sound data is not 0 bytes\n");
                }

                return(1);
            }

            return(0);
        }
Exemplo n.º 3
0
        private int parse_aiff_header(LameGlobalFlags gfp, Stream sf)
        {
            int  subSize = 0, dataType = IFF_ID_NONE;
            var  aiff_info = new IFF_AIFF();
            int  seen_comm_chunk = 0, seen_ssnd_chunk = 0;
            long pcm_data_pos = -1;
            var  chunkSize    = Read32BitsHighLow(sf);
            var  typeID       = Read32BitsHighLow(sf);

            if (typeID != IFF_ID_AIFF && typeID != IFF_ID_AIFC)
            {
                return(-1);
            }

            while (chunkSize > 0)
            {
                long ckSize;
                var  type = Read32BitsHighLow(sf);
                chunkSize -= 4;
                if (type == IFF_ID_COMM)
                {
                    seen_comm_chunk           = seen_ssnd_chunk + 1;
                    subSize                   = Read32BitsHighLow(sf);
                    ckSize                    = make_even_number_of_bytes_in_length(subSize);
                    chunkSize                -= (int)ckSize;
                    aiff_info.numChannels     = (short)Read16BitsHighLow(sf);
                    ckSize                   -= 2;
                    aiff_info.numSampleFrames = Read32BitsHighLow(sf);
                    ckSize                   -= 4;
                    aiff_info.sampleSize      = (short)Read16BitsHighLow(sf);
                    ckSize                   -= 2;
                    try
                    {
                        aiff_info.sampleRate = readIeeeExtendedHighLow(sf);
                    }
                    catch (IOException)
                    {
                        return(-1);
                    }

                    ckSize -= 10;
                    if (typeID == IFF_ID_AIFC)
                    {
                        dataType = Read32BitsHighLow(sf);
                        ckSize  -= 4;
                    }

                    try
                    {
                        sf.Seek((int)ckSize, SeekOrigin.Current);
                    }
                    catch (IOException)
                    {
                        return(-1);
                    }
                }
                else if (type == IFF_ID_SSND)
                {
                    seen_ssnd_chunk             = 1;
                    subSize                     = Read32BitsHighLow(sf);
                    ckSize                      = make_even_number_of_bytes_in_length(subSize);
                    chunkSize                  -= (int)ckSize;
                    aiff_info.blkAlgn.offset    = Read32BitsHighLow(sf);
                    ckSize                     -= 4;
                    aiff_info.blkAlgn.blockSize = Read32BitsHighLow(sf);
                    ckSize                     -= 4;
                    aiff_info.sampleType        = IFF_ID_SSND;
                    if (seen_comm_chunk > 0)
                    {
                        try
                        {
                            sf.Seek(aiff_info.blkAlgn.offset, SeekOrigin.Current);
                        }
                        catch (IOException)
                        {
                            return(-1);
                        }

                        break;
                    }

                    try
                    {
                        pcm_data_pos = sf.Position;
                    }
                    catch (IOException)
                    {
                        return(-1);
                    }

                    if (pcm_data_pos >= 0)
                    {
                        pcm_data_pos += aiff_info.blkAlgn.offset;
                    }

                    try
                    {
                        sf.Seek((int)ckSize, SeekOrigin.Current);
                    }
                    catch (IOException)
                    {
                        return(-1);
                    }
                }
                else
                {
                    subSize    = Read32BitsHighLow(sf);
                    ckSize     = make_even_number_of_bytes_in_length(subSize);
                    chunkSize -= (int)ckSize;
                    try
                    {
                        sf.Seek((int)ckSize, SeekOrigin.Current);
                    }
                    catch (IOException)
                    {
                        return(-1);
                    }
                }
            }

            if (dataType == IFF_ID_2CLE)
            {
                pcmswapbytes = parse.swapbytes;
            }
            else if (dataType == IFF_ID_2CBE)
            {
                pcmswapbytes = !parse.swapbytes;
            }
            else if (dataType == IFF_ID_NONE)
            {
                pcmswapbytes = !parse.swapbytes;
            }
            else
            {
                return(-1);
            }

            if (seen_comm_chunk != 0 && (seen_ssnd_chunk > 0 || aiff_info.numSampleFrames == 0))
            {
                if (0 != aiff_check2(aiff_info))
                {
                    return(0);
                }

                if (-1 == (gfp.num_channels = aiff_info.numChannels))
                {
                    return(0);
                }

                gfp.in_samplerate    = (int)aiff_info.sampleRate;
                gfp.num_samples      = aiff_info.numSampleFrames;
                pcmbitwidth          = aiff_info.sampleSize;
                pcm_is_unsigned_8bit = false;
                if (pcm_data_pos >= 0)
                {
                    try
                    {
                        sf.Seek(pcm_data_pos, SeekOrigin.Begin);
                    }
                    catch (IOException)
                    {
                        return(0);
                    }
                }

                return(1);
            }

            return(-1);
        }