Jump to content

  • Log In with Google      Sign In   
  • Create Account

Banner advertising on our site currently available from just $5!


1. Learn about the promo. 2. Sign up for GDNet+. 3. Set up your advert!


CdrTomalak

Member Since 12 Mar 2012
Offline Last Active Aug 01 2014 04:19 PM

Topics I've Started

Fade out using SlimDX

08 March 2014 - 02:26 PM

I'm trying to fade out my sprites in my 2d game using SlimDX. I've noted how it's done in XNA (http://www.xnadevelopment.com/tutorials/fadeinfadeout/FadeInFadeOut.shtml), but how would I do it in SlimDX?

 

I'm using SpriteTextRenderer as my sprite batch renderer class, which accepts a Color4 (with alpha) as a parameter to the Draw() method, but passing Color4(255,255,255,255) does not result in a full brightness non-faded sprite, so I'm doing something wrong clearly.

 

Any ideas?


How do I prevent clicking at the end of each sound play in OpenAL?

08 March 2014 - 01:32 PM

I have put together a basic sound handler class for use in my game. It uses OpenAL.

It's a simple method at the moment to play sounds - here's an extract from a switch block:

case "EATEN_PILL":
    wavPath = "D:\\Programming\\SFX\\EATEN_PILL\\Hit_43.wav";
    ALfilename = Path.Combine(Path.Combine("Data", "Audio"), wavPath);
    sound_data = LoadWave(File.Open(ALfilename, FileMode.Open), out channels, out bits_per_sample, out sample_rate);
    buffer_EATEN_PILL = AL.GenBuffer();
    AL.BufferData(buffer_EATEN_PILL, GetSoundFormat(channels, bits_per_sample), sound_data, sound_data.Length, sample_rate);
    AL.Source(source, ALSourcei.Buffer, buffer_EATEN_PILL);
    AL.SourcePlay(source);
    break;

Problems:

1. An annoying click at the end of each sound.

2. Eventually sound stops playing completely. This is after perhaps playing 100 sounds.

 

Has anyone hit this problem before?

 


NAudio problems.

02 February 2014 - 12:23 PM

Hi,

I have coded two methods of audio into my game engine based on NAudio.

  1. Create a WaveOutEvent object every time a sound needs to be be played.
  2. Create arrays of WaveOutEvent objects already initialised to play certain sounds. The play method checks the array to detect the first player in the array which is not stopped, and plays it.

Ok, so neither of these work yet. I need some advice!

Details on 1:

The play sound method uses a string variable 'path', which contains the path of the wav file to be played.

                if(mode == "SINGLE")
                {
                    WaveOutEvent wavePlayer1;
                    AudioFileReader file1;
                    
                    wavePlayer1 = new WaveOutEvent();
                    file1 = new AudioFileReader(path);
                    wavePlayer1.Init(file1);
                    wavePlayer1.Play();                     
                }

The sound plays once, but when I attempt to play the second time I get the error "Error: Already allocated calling waveOutOpen". This confuses me since a new WaveOutEvent object local to the block of code is created and played, meaning subsequent objects are new objects - not the same. Is that right?

Details on 2:

The initialisation code called at the start of the game engine is pretty basic:

                    // Array of players ----------------------------------------
                    NAudio_EATEN_GHOST_Array = new WaveOutEvent[noOfPlayers];
                    NAudio_EATEN_PILL_Array = new WaveOutEvent[noOfPlayers];
                    NAudio_EATEN_POWERPILL_Array = new WaveOutEvent[noOfPlayers];
                    NAudio_KILLED_BY_GHOST_Array = new WaveOutEvent[noOfPlayers];   
                    
                    AudioFileReader file;
                    
                    for(int i=0;i<NAudio_EATEN_GHOST_Array.Length;i++)
                    {
                        NAudio_EATEN_GHOST_Array[i] = new WaveOutEvent();
                        file = new AudioFileReader("D:\\Programming\\SFX\\EATEN_GHOST\\Hit_55.wav");
                        NAudio_EATEN_GHOST_Array[i].Init(file);
                        
                        NAudio_EATEN_PILL_Array[i] = new WaveOutEvent();
                        file = new AudioFileReader("D:\\Programming\\SFX\\EATEN_PILL\\Hit_43_s.wav");
                        NAudio_EATEN_PILL_Array[i].Init(file);
        
                        NAudio_EATEN_POWERPILL_Array[i] = new WaveOutEvent();
                        file = new AudioFileReader("D:\\Programming\\SFX\\EATEN_POWERPILL\\Hit_49.wav");        
                        NAudio_EATEN_POWERPILL_Array[i].Init(file);
    
                        NAudio_KILLED_BY_GHOST_Array[i] = new WaveOutEvent();
                        file = new AudioFileReader("D:\\Programming\\SFX\\KILLED_BY_GHOST\\Hit_72.wav");
                        NAudio_KILLED_BY_GHOST_Array[i].Init(file);
                    }
                    // Array of players ----------------------------------------            

With the players all created, the method to play a sound includes the following code, which again is pretty basic and attempts to use the playback state event:

                if(mode == "PLAYER_ARRAY")
                {
                    switch(effectsIn)
                    {
                        case "KILLED_BY_GHOST":
                            // 1.   Choose a media player which is not playing.
                            i = 0;
                            do
                            {
                                if(NAudio_KILLED_BY_GHOST_Array[i].PlaybackState != PlaybackState.Stopped)
                                {
                                    // Keep looking
                                    i++;
                                }
                                else
                                {
                                    found = true;
                                }
                            } while( (i<NAudio_KILLED_BY_GHOST_Array.Length) && (!found));
                            // Now 'i' holds the index of the player which is not playing.
                            
                            // 2.   Play effect                 
                            if(found)
                            {
                                NAudio_KILLED_BY_GHOST_Array[i].Play();
                            }
                            break;
                            
                        case "EATEN_PILL":
                            // 1.   Choose a media player which is not playing.
                            i = 0;
                            do
                            {
                                MessageBox.Show(NAudio_EATEN_PILL_Array[i].PlaybackState.ToString());
                                if(NAudio_EATEN_PILL_Array[i].PlaybackState != PlaybackState.Stopped)
                                {
                                    // Keep looking
                                    i++;
                                }
                                else
                                {
                                    found = true;
                                }
                            } while( (i<NAudio_EATEN_PILL_Array.Length) && (!found));
                            // Now 'i' holds the index of the player which is not playing.
                            
                            // 2.   Play effect 
                            if(found)
                            {                   
                                NAudio_EATEN_PILL_Array[i].Play();
                            }
                            
                            break;
                        case "EATEN_GHOST":
                            // 1.   Choose a media player which is not playing.
                            i = 0;
                            do
                            {
                                if(NAudio_EATEN_GHOST_Array[i].PlaybackState != PlaybackState.Stopped)
                                {
                                    // Keep looking
                                    i++;
                                }
                                else
                                {
                                    found = true;
                                }
                            } while( (i<NAudio_EATEN_GHOST_Array.Length) && (!found));
                            // Now 'i' holds the index of the player which is not playing.
                            
                            // 2.   Play effect                 
                            if(found)
                            {
                                NAudio_EATEN_GHOST_Array[i].Play(); 
                            }
                            break;
                        case "EATEN_POWERPILL":
                            // 1.   Choose a media player which is not playing.
                            i = 0;
                            do
                            {
                                if(NAudio_EATEN_POWERPILL_Array[i].PlaybackState != PlaybackState.Stopped)
                                {
                                    // Keep looking
                                    i++;
                                }
                                else
                                {
                                    found = true;
                                }
                            } while( (i<NAudio_EATEN_POWERPILL_Array.Length) && (!found));
                            // Now 'i' holds the index of the player which is not playing.
                            
                            // 2.   Play effect                 
                            if(found)
                            {
                                NAudio_EATEN_POWERPILL_Array[i].Play();
                            }
                            break;
                    } // switch             
                }

In the case of the EATEN_PILL effect, there are 5 WaveOutEvent objects in the array. 5 sounds play successfully (noOfPlayers is 5...), but then no more. The rest of the calls give silence. The message box debug tells me that the sounds never go back to PlaybackState.Stopped. They are always 'PlaybackState.Playing'. But the sound is a second long, so how can this be?

In any case both attempts have not worked, and the code is pretty useless.

Am I coming from this from the wrong angle? Is there another way to use the cleverness of the API to achieve what I need to? Argh.


elays in wav playback using Naudio. Mis-use of threading?

01 February 2014 - 03:02 PM

Hi,

I'm looking to use Naudio for a game I'm making.

I've coded a simple initialisation routine, which currently has:

                    IWavePlayer wavePlayer1;
                    AudioFileReader file1;
                    string filename1 = "D:\\Programming\\SFX\\MUSIC\\IN_GAME_1.wav";
                    
                    wavePlayer1 = new WaveOut();
                    file1 = new AudioFileReader(filename1);
                    wavePlayer1.Init(file1);
                    Thread thread1 = new Thread(new ThreadStart(wavePlayer1.Play));
                    thread1.Start();

When I run the game, the wav file plays for maybe half a second, then it stops, and a second later it resumes.

If I place System.Threading.Thread.Sleep(5000) immediately after starting the thread, the delay has an additional 5 seconds. This seems to prove that 'thread1.Start();' isn't actually starting the sound in it's own thread at all.

Being a bit of a threading and Naudio noob can anyone tell me what I'm doing wrong here? My requirement for the game is to simply have the ability to play several sounds at once. Nothing major.

Any ideas?

Thanks in advance!


Easy to use c# sound API - thoughts?

29 January 2014 - 01:38 PM

Hi All,

 

I'm grappling with a number of sound API options for c#. My previous implementation using WMP.dll has hit problems of a wierd nature, and so I'm looking at plan B.

 

Getting irrKlang to work with sharpdevelop is proving futile.

 

What else can I use? Or more to the point what DO people here actually use for c# sound? I just need the ability to play simultaneous sounds really. Not much.

 

Thanks in advance! sad.png


PARTNERS