Ejemplo n.º 1
0
        public float[][] GetWaveData()
        {
            int numchannels = 0;
            int dummy       = 0;

            FMOD.SOUND_FORMAT  dummyformat    = FMOD.SOUND_FORMAT.NONE;
            FMOD.DSP_RESAMPLER dummyresampler = FMOD.DSP_RESAMPLER.LINEAR;
            int       count        = 0;
            const int WAVEDATASIZE = 512;

            system.getSoftwareFormat(ref dummy, ref dummyformat, ref numchannels, ref dummy, ref dummyresampler, ref dummy);

            float[][] wavedata = new float[numchannels][];

            /*
             *      DRAW WAVEDATA
             */
            for (count = 0; count < numchannels; count++)
            {
                wavedata[count] = new float[WAVEDATASIZE];

                if (currentChannel != null)
                {
                    currentChannel.getWaveData(wavedata[count], WAVEDATASIZE, count);
                }
            }

            return(wavedata);
        }
Ejemplo n.º 2
0
        private void drawOscilliscope(Graphics g)
        {
            int numchannels = 0;
            int dummy       = 0;

            FMOD.SOUND_FORMAT  dummyformat    = FMOD.SOUND_FORMAT.NONE;
            FMOD.DSP_RESAMPLER dummyresampler = FMOD.DSP_RESAMPLER.LINEAR;
            int count  = 0;
            int count2 = 0;

            system.getSoftwareFormat(ref dummy, ref dummyformat, ref numchannels, ref dummy, ref dummyresampler, ref dummy);

            /*
             *      DRAW WAVEDATA
             */
            for (count = 0; count < numchannels; count++)
            {
                system.getWaveData(wavedata, WAVEDATASIZE, count);

                for (count2 = 0; count2 < WAVEDATASIZE - 1; count2++)
                {
                    float y;

                    y = (wavedata[count2] + 1) / 2.0f * GRAPHICWINDOW_HEIGHT;

                    g.FillRectangle(mBrushWhite, count2 + GRAPHICWINDOW_WIDTH - WAVEDATASIZE - 10.0f, y, 1.0f, 1.0f);
                }
            }
        }
Ejemplo n.º 3
0
        private void drawSpectrum(Graphics g)
        {
            int numchannels = 0;
            int dummy       = 0;

            FMOD.SOUND_FORMAT  dummyformat    = FMOD.SOUND_FORMAT.NONE;
            FMOD.DSP_RESAMPLER dummyresampler = FMOD.DSP_RESAMPLER.LINEAR;
            int count  = 0;
            int count2 = 0;


            system.getSoftwareFormat(ref dummy, ref dummyformat, ref numchannels, ref dummy, ref dummyresampler, ref dummy);

            /*
             *      DRAW SPECTRUM
             */
            for (count = 0; count < numchannels; count++)
            {
                float max = 0;

                system.getSpectrum(spectrum, SPECTRUMSIZE, count, FMOD.DSP_FFT_WINDOW.TRIANGLE);

                for (count2 = 0; count2 < 255; count2++)
                {
                    if (max < spectrum[count2])
                    {
                        max = spectrum[count2];
                    }
                }

                /*
                 *  The upper band of frequencies at 44khz is pretty boring (ie 11-22khz), so we are only
                 *  going to display the first 256 frequencies, or (0-11khz)
                 */
                for (count2 = 0; count2 < 255; count2++)
                {
                    float height;

                    height = spectrum[count2] / max * GRAPHICWINDOW_HEIGHT;

                    if (height >= GRAPHICWINDOW_HEIGHT)
                    {
                        height = GRAPHICWINDOW_HEIGHT - 1;
                    }

                    if (height < 0)
                    {
                        height = 0;
                    }

                    height = GRAPHICWINDOW_HEIGHT - height;

                    g.FillRectangle(mBrushGreen, count2, height, 1.0f, GRAPHICWINDOW_HEIGHT - height);
                }
            }
        }
Ejemplo n.º 4
0
        private void JingleInit(string filename)
        {
            FMOD.Sound tempSound = null;
            thisLock = new Object();
            // Retrieve information about sound
            FMOD.RESULT result = system.createSound(filename, (FMOD.MODE._2D | FMOD.MODE.SOFTWARE), ref tempSound);
            ErrorCheck(result);

            FMOD.SOUND_TYPE   soundType   = (FMOD.SOUND_TYPE) 0;
            FMOD.SOUND_FORMAT soundFormat = (FMOD.SOUND_FORMAT) 0;

            int tempBits     = 0,
                tempChannels = 0,
                tempPriority = 0;

            uint tempPcm = 0;

            float tempFrequency = 0.0f,
                  tempPan       = 0.0f,
                  tempVolume    = 0.0f;

            result = tempSound.getFormat(ref soundType, ref soundFormat, ref tempChannels, ref tempBits);
            ErrorCheck(result);

            result = tempSound.getDefaults(ref tempFrequency, ref tempVolume, ref tempPan, ref tempPriority);
            ErrorCheck(result);

            result = tempSound.getLength(ref tempPcm, FMOD.TIMEUNIT.PCM);
            ErrorCheck(result);

            // Fill sound parameters
            ChannelCount = tempChannels;
            Frequency    = (int)tempFrequency;
            pcm          = tempPcm;
            bits         = tempBits;

            // Obtain Raw PCM data from sound
            GetRawData(tempSound, tempChannels, tempBits, tempPcm);


            // Release temp sound instance
            tempSound.release();
            tempSound = null;


            FMOD.CREATESOUNDEXINFO exInfo = new FMOD.CREATESOUNDEXINFO();
            exInfo.cbsize           = Marshal.SizeOf(exInfo);
            exInfo.length           = (uint)(pcm * sizeof(short));
            exInfo.numchannels      = ChannelCount;
            exInfo.format           = FMOD.SOUND_FORMAT.PCM16;
            exInfo.defaultfrequency = (int)Frequency;
            // Create a stream from obtained data

            result = system.createStream(SoundDataBuffer.Buffer, (FMOD.MODE.OPENMEMORY | FMOD.MODE.OPENRAW), ref exInfo, ref sounds);
            ErrorCheck(result);
        } // loading jingle
Ejemplo n.º 5
0
        private void comboBoxRecord_SelectedIndexChanged(object sender, System.EventArgs e)
        {
            FMOD.CREATESOUNDEXINFO exinfo = new FMOD.CREATESOUNDEXINFO();
            FMOD.RESULT            result;
            FMOD.DSP_RESAMPLER     resampler = FMOD.DSP_RESAMPLER.MAX;
            int selected = comboBoxRecord.SelectedIndex;
            int temp     = 0;

            FMOD.SOUND_FORMAT format = FMOD.SOUND_FORMAT.NONE;

            result = system.setSoftwareFormat(OUTPUTRATE, FMOD.SOUND_FORMAT.PCM16, 1, 0, 0);
            ERRCHECK(result);

            result = system.init(32, FMOD.INITFLAGS.NORMAL, (IntPtr)null);
            ERRCHECK(result);

            result = system.getSoftwareFormat(ref outputfreq, ref format, ref temp, ref temp, ref resampler, ref temp);
            ERRCHECK(result);

            /*
             *  Create a sound to record to.
             */
            exinfo.cbsize           = Marshal.SizeOf(exinfo);
            exinfo.numchannels      = 1;
            exinfo.format           = FMOD.SOUND_FORMAT.PCM16;
            exinfo.defaultfrequency = OUTPUTRATE;
            exinfo.length           = (uint)(exinfo.defaultfrequency * 2 * exinfo.numchannels * 5);

            result = system.createSound((string)null, (FMOD.MODE._2D | FMOD.MODE.SOFTWARE | FMOD.MODE.LOOP_NORMAL | FMOD.MODE.OPENUSER), ref exinfo, ref sound);
            ERRCHECK(result);

            comboBoxOutput.Enabled   = false;
            comboBoxPlayback.Enabled = false;
            comboBoxRecord.Enabled   = false;

            /*
             *  Start recording
             */
            result = system.recordStart(selected, sound, true);
            ERRCHECK(result);

            Thread.Sleep(200);      /* Give it some time to record something */

            result = system.playSound(FMOD.CHANNELINDEX.REUSE, sound, false, ref channel);
            ERRCHECK(result);

            /* Dont hear what is being recorded otherwise it will feedback.  Spectrum analysis is done before volume scaling in the DSP chain */
            result = channel.setVolume(0);
            ERRCHECK(result);
        }
Ejemplo n.º 6
0
        /// <summary>
        /// Run through each of the frequency bands and record the data
        /// for the current pont in time in the audio track
        /// </summary>
        private void GetSpectrumData(uint period)
        {
//			int num = 0;
//			int num2 = 0;
            int sampleRate        = 0;
            int numOutputChannels = 0;
            int maxInputChannels  = 0;
            int numBits           = 0;

            FMOD.SOUND_FORMAT  sOUND_FORMAT  = FMOD.SOUND_FORMAT.NONE;
            FMOD.DSP_RESAMPLER dSP_RESAMPLER = FMOD.DSP_RESAMPLER.LINEAR;

            m_FMOD_system.getSoftwareFormat(ref sampleRate /* num2 */,
                                            ref sOUND_FORMAT,
                                            ref numOutputChannels /* num */,
                                            ref maxInputChannels /* num2 */,
                                            ref dSP_RESAMPLER,
                                            ref numBits /* num2 */);

            // for each of the output channels
            for (int currentChannel = 0; currentChannel < numOutputChannels; currentChannel++)
            {
                // get the spectrum data for this channel
                m_FMOD_system.getSpectrum(m_FMOD_spectrum, 512, currentChannel, FMOD.DSP_FFT_WINDOW.TRIANGLE);

                // update each frequency band for this period
                foreach (var currentFrequencyBand in m_mapOfFrequencyBands)
                {
                    // this is a magic number that I have not yet tracked down.
                    float currentLevel = 0f;
                    for (int j = currentFrequencyBand.Value.FmodLowFrequency; j < currentFrequencyBand.Value.FmodHighFrequency; j++)
                    {
                        // find the highest value available to this band
                        currentLevel = Math.Max(currentLevel, m_FMOD_spectrum[j]);
                    }
                    currentFrequencyBand.Value.add(period, currentLevel);
                } // end process each frequency band
            }     // end process each channel
        }         // GetSpectrumData
        private void timer_Tick(object sender, System.EventArgs e)
        {
            FMOD.RESULT    result;
            FMOD.OPENSTATE openstate = 0;

            if (soundcreated)
            {
                uint percentbuffered = 0;
                bool starving        = false;
                bool busy            = false;

                result = sound.getOpenState(ref openstate, ref percentbuffered, ref starving, ref busy);
                ERRCHECK(result);

                if (openstate == FMOD.OPENSTATE.READY && channel == null)
                {
                    result = system.playSound(FMOD.CHANNELINDEX.FREE, sound, false, ref channel);
                    ERRCHECK(result);
                }
            }

            if (channel != null)
            {
                uint ms          = 0;
                bool playing     = false;
                bool paused      = false;
                int  tagsupdated = 0;
                int  numtags     = 0;

                result = sound.getNumTags(ref numtags, ref tagsupdated);
                ERRCHECK(result);

                if (tagsupdated != 0)
                {
                    for (;;)
                    {
                        FMOD.TAG tag = new FMOD.TAG();

                        if (sound.getTag(null, -1, ref tag) != FMOD.RESULT.OK)
                        {
                            break;
                        }

                        if (tag.datatype == FMOD.TAGDATATYPE.STRING)
                        {
                            FMOD.SOUND_FORMAT format = FMOD.SOUND_FORMAT.NONE;
                            int channels             = 0;
                            int bits = 0;

                            sound.getFormat(ref gSoundType, ref format, ref channels, ref bits);

                            if (tag.name == "ARTIST")
                            {
                                if (Marshal.PtrToStringAnsi(tag.data) != gCurrentTrackArtist)
                                {
                                    gCurrentTrackArtist = Marshal.PtrToStringAnsi(tag.data);
                                    gUpdateFileName     = true;
                                }
                            }
                            if (tag.name == "TITLE")
                            {
                                if (Marshal.PtrToStringAnsi(tag.data) != gCurrentTrackTitle)
                                {
                                    gCurrentTrackTitle = Marshal.PtrToStringAnsi(tag.data);
                                    gUpdateFileName    = true;
                                }
                            }
                            break;
                        }
                        else
                        {
                            break;
                        }
                    }
                }

                result = channel.isPlaying(ref playing);
                if (result != FMOD.RESULT.OK || !playing)
                {
                    sound.release();
                    sound   = null;
                    channel = null;
                }
                else
                {
                    result = channel.getPaused(ref paused);
                    ERRCHECK(result);
                    result = channel.getPosition(ref ms, FMOD.TIMEUNIT.MS);
                    ERRCHECK(result);

                    statusBar.Text = "Time " + (ms / 1000 / 60) + ":" + (ms / 1000 % 60) + ":" + (ms / 10 % 100) + (paused ? " Paused " : playing ? " Playing" : " Stopped");
                }
            }

            if (sound != null)
            {
                uint percentbuffered = 0;
                bool starving        = false;
                bool busy            = false;

                sound.getOpenState(ref openstate, ref percentbuffered, ref starving, ref busy);

                if (openstate == FMOD.OPENSTATE.ERROR)
                {
                    sound.release();
                    sound   = null;
                    channel = null;
                }
            }

            if (openstate == FMOD.OPENSTATE.ERROR)
            {
                statusBar.Text = "Error occurred or stream ended.  Restarting stream..";
                result         = system.createSound(url, (FMOD.MODE.HARDWARE | FMOD.MODE._2D | FMOD.MODE.CREATESTREAM | FMOD.MODE.NONBLOCKING), ref exinfo, ref sound);
                ERRCHECK(result);
            }

            if (system != null)
            {
                system.update();
            }
        }
Ejemplo n.º 8
0
        public bool Create(SoundSystemConfig config)
        {
            uint version    = 0;
            int  samplerate = 44100;

            FMOD.SOUND_FORMAT format = FMOD.SOUND_FORMAT.PCM16;

            FMOD.RESULT result = FMOD.Factory.System_Create(ref m_system);
            if (ERRCHECK(result, "Create") == false)
            {
                return(false);
            }

            result = m_system.getVersion(ref version);
            if (!ERRCHECK(result))
            {
                return(false);
            }

            if (version < FMOD.VERSION.number)
            {
                Console.WriteLine("INCORRECT DLL VERSION!!", "FMOD ERROR");
                return(false);
            }

            result = m_system.setDriver(config.SoundCard);
            ERRCHECK(result);

            switch (config.Output)
            {
            case RASOUNDAUSGABE.WINMM:
                m_system.setOutput(FMOD.OUTPUTTYPE.WINMM);
                break;

            case RASOUNDAUSGABE.WASAPI:
                m_system.setOutput(FMOD.OUTPUTTYPE.WASAPI);
                break;

            case RASOUNDAUSGABE.DSOUND:
                m_system.setOutput(FMOD.OUTPUTTYPE.DSOUND);
                break;

            case RASOUNDAUSGABE.ASIO:
                m_system.setOutput(FMOD.OUTPUTTYPE.ASIO);
                break;
            }
            ;
            switch (config.Format)
            {
            case RASOUNDFORMAT.PCM16_44100:
                samplerate = 44100;
                format     = FMOD.SOUND_FORMAT.PCM16;
                break;

            case RASOUNDFORMAT.PCM16_48000:
                samplerate = 48000;
                format     = FMOD.SOUND_FORMAT.PCM16;
                break;

            case RASOUNDFORMAT.PCM16_96000:
                samplerate = 96000;
                format     = FMOD.SOUND_FORMAT.PCM16;
                break;

            case RASOUNDFORMAT.PCM24_44100:
                samplerate = 44100;
                format     = FMOD.SOUND_FORMAT.PCM24;
                break;

            case RASOUNDFORMAT.PCM24_48000:
                samplerate = 48000;
                format     = FMOD.SOUND_FORMAT.PCM24;
                break;

            case RASOUNDFORMAT.PCM24_96000:
                samplerate = 96000;
                format     = FMOD.SOUND_FORMAT.PCM24;
                break;

            case RASOUNDFORMAT.PCM24_192000:
                samplerate = 192000;
                format     = FMOD.SOUND_FORMAT.PCM24;
                break;

            case RASOUNDFORMAT.PCMFLOAT_44100:
                samplerate = 44100;
                format     = FMOD.SOUND_FORMAT.PCMFLOAT;
                break;

            case RASOUNDFORMAT.PCMFLOAT_48000:
                samplerate = 48000;
                format     = FMOD.SOUND_FORMAT.PCMFLOAT;
                break;

            case RASOUNDFORMAT.PCMFLOAT_96000:
                samplerate = 96000;
                format     = FMOD.SOUND_FORMAT.PCMFLOAT;
                break;

            case RASOUNDFORMAT.PCMFLOAT_192000:
                samplerate = 192000;
                format     = FMOD.SOUND_FORMAT.PCMFLOAT;
                break;

            case RASOUNDFORMAT.PCM32_44100:
                samplerate = 44100;
                format     = FMOD.SOUND_FORMAT.PCM32;
                break;

            case RASOUNDFORMAT.PCM32_48000:
                samplerate = 48000;
                format     = FMOD.SOUND_FORMAT.PCM32;
                break;

            case RASOUNDFORMAT.PCM32_96000:
                samplerate = 96000;
                format     = FMOD.SOUND_FORMAT.PCM32;
                break;

            case RASOUNDFORMAT.PCM32_192000:
                samplerate = 192000;
                format     = FMOD.SOUND_FORMAT.PCM32;
                break;
            }
            m_system.setSoftwareFormat(samplerate, format, 0, 0, FMOD.DSP_RESAMPLER.LINEAR);

            switch (config.Channel)
            {
            case RACHANNELMODE.Mono:
                result = m_system.setSpeakerMode(FMOD.SPEAKERMODE.MONO);
                break;

            case RACHANNELMODE.Stereo:
                result = m_system.setSpeakerMode(FMOD.SPEAKERMODE.STEREO);
                break;

            case RACHANNELMODE.Quad:
                result = m_system.setSpeakerMode(FMOD.SPEAKERMODE.QUAD);
                break;

            case RACHANNELMODE.FiveDotOne:
                result = m_system.setSpeakerMode(FMOD.SPEAKERMODE._5POINT1);
                break;

            case RACHANNELMODE.SevenDotOne:
                result = m_system.setSpeakerMode(FMOD.SPEAKERMODE._7POINT1);
                break;

            case RACHANNELMODE.Surround:
                result = m_system.setSpeakerMode(FMOD.SPEAKERMODE.SURROUND);
                break;
            }
            ;
            result = m_system.init(32, FMOD.INITFLAGS._3D_RIGHTHANDED | FMOD.INITFLAGS.DTS_NEURALSURROUND, IntPtr.Zero);
            if (!ERRCHECK(result))
            {
                return(false);
            }

            m_system.set3DSettings(1.0f, 1.0f, 1.0f);

            Console.WriteLine("[FMOD] SoundSystem created");

            m_system.get3DListenerAttributes(0, ref pos, ref vel, ref forward, ref up);

            return(true);
        }
Ejemplo n.º 9
0
        public static void WriteWavHeader(FileStream stream, FMOD.Sound sound, int length, Object usingFmod)
        {
            FMOD.SOUND_TYPE   type = FMOD.SOUND_TYPE.UNKNOWN;
            FMOD.SOUND_FORMAT format = FMOD.SOUND_FORMAT.NONE;
            int   channels = 0, bits = 0, temp1 = 0;
            float rate = 0.0f;
            float temp = 0.0f;

            if (sound == null)
            {
                return;
            }
            lock (usingFmod) {
                sound.getFormat(ref type, ref format, ref channels, ref bits);
                sound.getDefaults(ref rate, ref temp, ref temp, ref temp1);
            }

            log.Info("WaveWriter.WriteWavHeader: sound format: dataLength " + length + ", type " + type + ", format " + format +
                     ", channels " + channels + ", bits " + bits + ", rate " + rate);

            stream.Seek(0, SeekOrigin.Begin);

            FmtChunk  fmtChunk  = new FmtChunk();
            DataChunk dataChunk = new DataChunk();
            WavHeader wavHeader = new WavHeader();
            RiffChunk riffChunk = new RiffChunk();

            fmtChunk.chunk           = new RiffChunk();
            fmtChunk.chunk.id        = new char[4];
            fmtChunk.chunk.id[0]     = 'f';
            fmtChunk.chunk.id[1]     = 'm';
            fmtChunk.chunk.id[2]     = 't';
            fmtChunk.chunk.id[3]     = ' ';
            fmtChunk.chunk.size      = Marshal.SizeOf(fmtChunk) - Marshal.SizeOf(riffChunk);
            fmtChunk.wFormatTag      = 1;
            fmtChunk.nChannels       = (ushort)channels;
            fmtChunk.nSamplesPerSec  = (uint)rate;
            fmtChunk.nAvgBytesPerSec = (uint)(rate * channels * bits / 8);
            fmtChunk.nBlockAlign     = (ushort)(1 * channels * bits / 8);
            fmtChunk.wBitsPerSample  = (ushort)bits;

            dataChunk.chunk       = new RiffChunk();
            dataChunk.chunk.id    = new char[4];
            dataChunk.chunk.id[0] = 'd';
            dataChunk.chunk.id[1] = 'a';
            dataChunk.chunk.id[2] = 't';
            dataChunk.chunk.id[3] = 'a';
            dataChunk.chunk.size  = (int)length;

            wavHeader.chunk       = new RiffChunk();
            wavHeader.chunk.id    = new char[4];
            wavHeader.chunk.id[0] = 'R';
            wavHeader.chunk.id[1] = 'I';
            wavHeader.chunk.id[2] = 'F';
            wavHeader.chunk.id[3] = 'F';
            wavHeader.chunk.size  = (int)(Marshal.SizeOf(fmtChunk) + Marshal.SizeOf(riffChunk) + length);
            wavHeader.rifftype    = new char[4];
            wavHeader.rifftype[0] = 'W';
            wavHeader.rifftype[1] = 'A';
            wavHeader.rifftype[2] = 'V';
            wavHeader.rifftype[3] = 'E';

            /*
             *  Write out the WAV header.
             */
            IntPtr wavHeaderPtr = Marshal.AllocHGlobal(Marshal.SizeOf(wavHeader));
            IntPtr fmtChunkPtr  = Marshal.AllocHGlobal(Marshal.SizeOf(fmtChunk));
            IntPtr dataChunkPtr = Marshal.AllocHGlobal(Marshal.SizeOf(dataChunk));

            byte   [] wavHeaderBytes = new byte[Marshal.SizeOf(wavHeader)];
            byte   [] fmtChunkBytes  = new byte[Marshal.SizeOf(fmtChunk)];
            byte   [] dataChunkBytes = new byte[Marshal.SizeOf(dataChunk)];

            Marshal.StructureToPtr(wavHeader, wavHeaderPtr, false);
            Marshal.Copy(wavHeaderPtr, wavHeaderBytes, 0, Marshal.SizeOf(wavHeader));

            Marshal.StructureToPtr(fmtChunk, fmtChunkPtr, false);
            Marshal.Copy(fmtChunkPtr, fmtChunkBytes, 0, Marshal.SizeOf(fmtChunk));

            Marshal.StructureToPtr(dataChunk, dataChunkPtr, false);
            Marshal.Copy(dataChunkPtr, dataChunkBytes, 0, Marshal.SizeOf(dataChunk));

            stream.Write(wavHeaderBytes, 0, Marshal.SizeOf(wavHeader));
            stream.Write(fmtChunkBytes, 0, Marshal.SizeOf(fmtChunk));
            stream.Write(dataChunkBytes, 0, Marshal.SizeOf(dataChunk));
        }
Ejemplo n.º 10
0
        private void SaveToWav()
        {
            FileStream fs = null;
            int        channels = 0, bits = 0;
            float      rate = 0;
            IntPtr     ptr1 = new IntPtr(), ptr2 = new IntPtr();
            uint       lenbytes = 0, len1 = 0, len2 = 0;

            FMOD.SOUND_TYPE   type   = FMOD.SOUND_TYPE.WAV;
            FMOD.SOUND_FORMAT format = FMOD.SOUND_FORMAT.NONE;
            int   temp1 = 0;
            float temp3 = 0;

            if (sound == null)
            {
                return;
            }

            sound.getFormat(ref type, ref format, ref channels, ref bits);
            sound.getDefaults(ref rate, ref temp3, ref temp3, ref temp1);
            sound.getLength(ref lenbytes, FMOD.TIMEUNIT.PCMBYTES);

            FmtChunk  fmtChunk  = new FmtChunk();
            DataChunk dataChunk = new DataChunk();
            WavHeader wavHeader = new WavHeader();
            RiffChunk riffChunk = new RiffChunk();

            fmtChunk.chunk           = new RiffChunk();
            fmtChunk.chunk.id        = new char[4];
            fmtChunk.chunk.id[0]     = 'f';
            fmtChunk.chunk.id[1]     = 'm';
            fmtChunk.chunk.id[2]     = 't';
            fmtChunk.chunk.id[3]     = ' ';
            fmtChunk.chunk.size      = Marshal.SizeOf(fmtChunk) - Marshal.SizeOf(riffChunk);
            fmtChunk.wFormatTag      = 1;
            fmtChunk.nChannels       = (ushort)channels;
            fmtChunk.nSamplesPerSec  = (uint)rate;
            fmtChunk.nAvgBytesPerSec = (uint)(rate * channels * bits / 8);
            fmtChunk.nBlockAlign     = (ushort)(1 * channels * bits / 8);
            fmtChunk.wBitsPerSample  = (ushort)bits;

            dataChunk.chunk       = new RiffChunk();
            dataChunk.chunk.id    = new char[4];
            dataChunk.chunk.id[0] = 'd';
            dataChunk.chunk.id[1] = 'a';
            dataChunk.chunk.id[2] = 't';
            dataChunk.chunk.id[3] = 'a';
            dataChunk.chunk.size  = (int)lenbytes;

            wavHeader.chunk       = new RiffChunk();
            wavHeader.chunk.id    = new char[4];
            wavHeader.chunk.id[0] = 'R';
            wavHeader.chunk.id[1] = 'I';
            wavHeader.chunk.id[2] = 'F';
            wavHeader.chunk.id[3] = 'F';
            wavHeader.chunk.size  = (int)(Marshal.SizeOf(fmtChunk) + Marshal.SizeOf(riffChunk) + lenbytes);
            wavHeader.rifftype    = new char[4];
            wavHeader.rifftype[0] = 'W';
            wavHeader.rifftype[1] = 'A';
            wavHeader.rifftype[2] = 'V';
            wavHeader.rifftype[3] = 'E';

            fs = new FileStream("record.wav", FileMode.Create, FileAccess.Write);

            /*
             *  Write out the WAV header.
             */
            IntPtr wavHeaderPtr = Marshal.AllocHGlobal(Marshal.SizeOf(wavHeader));
            IntPtr fmtChunkPtr  = Marshal.AllocHGlobal(Marshal.SizeOf(fmtChunk));
            IntPtr dataChunkPtr = Marshal.AllocHGlobal(Marshal.SizeOf(dataChunk));

            byte   [] wavHeaderBytes = new byte[Marshal.SizeOf(wavHeader)];
            byte   [] fmtChunkBytes  = new byte[Marshal.SizeOf(fmtChunk)];
            byte   [] dataChunkBytes = new byte[Marshal.SizeOf(dataChunk)];

            Marshal.StructureToPtr(wavHeader, wavHeaderPtr, false);
            Marshal.Copy(wavHeaderPtr, wavHeaderBytes, 0, Marshal.SizeOf(wavHeader));

            Marshal.StructureToPtr(fmtChunk, fmtChunkPtr, false);
            Marshal.Copy(fmtChunkPtr, fmtChunkBytes, 0, Marshal.SizeOf(fmtChunk));

            Marshal.StructureToPtr(dataChunk, dataChunkPtr, false);
            Marshal.Copy(dataChunkPtr, dataChunkBytes, 0, Marshal.SizeOf(dataChunk));

            fs.Write(wavHeaderBytes, 0, Marshal.SizeOf(wavHeader));
            fs.Write(fmtChunkBytes, 0, Marshal.SizeOf(fmtChunk));
            fs.Write(dataChunkBytes, 0, Marshal.SizeOf(dataChunk));

            /*
             *  Lock the sound to get access to the raw data.
             */
            sound.@lock(0, lenbytes, ref ptr1, ref ptr2, ref len1, ref len2);

            /*
             *  Write it to disk.
             */
            byte [] rawdata = new byte[len1];

            Marshal.Copy(ptr1, rawdata, 0, (int)len1);

            fs.Write(rawdata, 0, (int)len1);

            /*
             *  Unlock the sound to allow FMOD to use it again.
             */
            sound.unlock(ptr1, ptr2, len1, len2);

            fs.Close();

            MessageBox.Show("Written to record.wav");
        }
Ejemplo n.º 11
0
        public float[][] GetSpectrum()
        {
            system.update();

            int numchannels = 0;
            int dummy       = 0;

            FMOD.SOUND_FORMAT  dummyformat    = FMOD.SOUND_FORMAT.NONE;
            FMOD.DSP_RESAMPLER dummyresampler = FMOD.DSP_RESAMPLER.LINEAR;
            int count  = 0;
            int count2 = 0;

            system.getSoftwareFormat(ref dummy, ref dummyformat, ref numchannels, ref dummy, ref dummyresampler, ref dummy);
            float[][] spectrum = new float[numchannels][];

            /*
             *      DRAW SPECTRUM
             */
            for (count = 0; count < numchannels; count++)
            {
                float max = 0;

                spectrum[count] = new float[SPECTRUMSIZE];

                if (currentChannel != null)
                {
                    currentChannel.getSpectrum(spectrum[count], SPECTRUMSIZE, count, FMOD.DSP_FFT_WINDOW.HAMMING);

                    /*for (count2 = 0; count2 < SPECTRUMSIZE; count2++)
                     * {
                     *  if (max < spectrum[count][count2])
                     *  {
                     *      max = spectrum[count][count2];
                     *  }
                     * }*/

                    // Sonst sieht man nicht viel...
                    max = 0.2F;

                    for (count2 = 0; count2 < SPECTRUMSIZE; count2++)
                    {
                        float height;

                        height = spectrum[count][count2] / max;

                        if (height >= 1)
                        {
                            height = 1;
                        }

                        if (height < 0)
                        {
                            height = 0;
                        }

                        spectrum[count][count2] = height;
                    }
                }
            }

            return(spectrum);
        }