Hello,
I have 4 channels and all of them are part of 1 Sound_Effects channel group. If I try to stop only one channel it does not stop.
Thank You
Hello,
I have 4 channels and all of them are part of 1 Sound_Effects channel group. If I try to stop only one channel it does not stop.
Thank You
Hi,
What version of FMOD are you using?
Could you share the code you are using when trying to stop the channel?
Hey,
I’m using FMOD version 2.02.08.
Below I have added the code I use to stop
// Creating channels
FMOD::Channel* impact_channel, * rev_channel, * idle_channel, * skid_channel;
// Creating Channel Group
FMOD::ChannelGroup* sfx_chanel_group;
fmod_system->createChannelGroup(“sfx_chanel”, &sfx_chanel_group);
sfx_chanel_group->setMode(FMOD_CREATECOMPRESSEDSAMPLE | FMOD_LOOP_OFF);
// Setting the group for the channels
impact_channel->setChannelGroup(sfx_chanel_group);
idle_channel->setChannelGroup(sfx_chanel_group);
rev_channel->setChannelGroup(sfx_chanel_group);
skid_channel->setChannelGroup(sfx_chanel_group);
// To play sound
fmod_system->playSound(loaded_audio_files_map[tag], nullptr, false, &skid_channell);
// Calling stop at a specific action
skid_channel->stop();
The system loads the correct sound and plays it but the stop call does not stop the sound it keeps going until the sound file is finished.
Thanks for sharing that.
I would recommend using FMOD_RESULT
which is very useful for debugging FMOD function calls. A list of the error codes can be found under FMOD API | Core API Reference.
I added your code to the FMOD Examples Found in C:\Program Files (x86)\FMOD SoundSystem\FMOD Studio API Windows\api\core\examples\vs2019
.
I am not sure if you did not add it but FMOD::Channels
should be initialized with = 0
to make sure they are valid memory. This is something that was causing issues for me.
// Creating channels
FMOD::Channel* impact_channel, * rev_channel, * idle_channel, * skid_channel = 0;
Here you are trying to call into each of the Channels
before they have been created by the FMOD System. If you checked the result it would be An invalid object handle was used.
So to fix this, wait till the sound has been played on the channel and it has been created to assign it to the ChannelGroup
.
#include "fmod.hpp"
#include "common.h"
int FMOD_Main()
{
FMOD::System* system;
FMOD::Sound* sound1, * sound2, * sound3;
FMOD::Channel* channel = 0;
FMOD_RESULT result;
void* extradriverdata = 0;
Common_Init(&extradriverdata);
/*
Create a System object and initialize
*/
result = FMOD::System_Create(&system);
ERRCHECK(result);
result = system->init(32, FMOD_INIT_NORMAL, extradriverdata);
ERRCHECK(result);
result = system->createSound(Common_MediaPath("drumloop.wav"), FMOD_DEFAULT, 0, &sound1);
ERRCHECK(result);
//result = sound1->setMode(FMOD_LOOP_OFF); /* drumloop.wav has embedded loop points which automatically makes looping turn on, */
//ERRCHECK(result); /* so turn it off here. We could have also just put FMOD_LOOP_OFF in the above CreateSound call. */
result = system->createSound(Common_MediaPath("jaguar.wav"), FMOD_DEFAULT, 0, &sound2);
ERRCHECK(result);
result = system->createSound(Common_MediaPath("swish.wav"), FMOD_DEFAULT, 0, &sound3);
ERRCHECK(result);
// Creating channels
FMOD::Channel* impact_channel, * rev_channel, * idle_channel, * skid_channel = 0;
// Creating Channel Group
FMOD::ChannelGroup* sfx_chanel_group;
result = system->createChannelGroup("sfx_chanel", &sfx_chanel_group);
ERRCHECK(result);
result = sfx_chanel_group->setMode(FMOD_CREATECOMPRESSEDSAMPLE | FMOD_LOOP_OFF);
ERRCHECK(result);
// Play the sound first
result = system->playSound(sound1, nullptr, false, &skid_channel);
ERRCHECK(result);
// Once the channel has been created by the FMOD system then add it to the group
result = skid_channel->setChannelGroup(sfx_chanel_group);
ERRCHECK(result);
/*
Main loop
*/
do
{
Common_Update();
if (Common_BtnPress(BTN_ACTION1))
{
//result = system->playSound(sound1, 0, false, &channel);
result = skid_channel->stop();
ERRCHECK(result);
}
if (Common_BtnPress(BTN_ACTION2))
{
result = system->playSound(sound2, 0, false, &channel);
ERRCHECK(result);
}
if (Common_BtnPress(BTN_ACTION3))
{
result = system->playSound(sound3, 0, false, &channel);
ERRCHECK(result);
}
result = system->update();
ERRCHECK(result);
{
unsigned int ms = 0;
unsigned int lenms = 0;
bool playing = 0;
bool paused = 0;
int channelsplaying = 0;
if (channel)
{
FMOD::Sound* currentsound = 0;
result = channel->isPlaying(&playing);
if ((result != FMOD_OK) && (result != FMOD_ERR_INVALID_HANDLE) && (result != FMOD_ERR_CHANNEL_STOLEN))
{
ERRCHECK(result);
}
result = channel->getPaused(&paused);
if ((result != FMOD_OK) && (result != FMOD_ERR_INVALID_HANDLE) && (result != FMOD_ERR_CHANNEL_STOLEN))
{
ERRCHECK(result);
}
result = channel->getPosition(&ms, FMOD_TIMEUNIT_MS);
if ((result != FMOD_OK) && (result != FMOD_ERR_INVALID_HANDLE) && (result != FMOD_ERR_CHANNEL_STOLEN))
{
ERRCHECK(result);
}
channel->getCurrentSound(¤tsound);
if (currentsound)
{
result = currentsound->getLength(&lenms, FMOD_TIMEUNIT_MS);
if ((result != FMOD_OK) && (result != FMOD_ERR_INVALID_HANDLE) && (result != FMOD_ERR_CHANNEL_STOLEN))
{
ERRCHECK(result);
}
}
}
system->getChannelsPlaying(&channelsplaying, NULL);
Common_Draw("==================================================");
Common_Draw("Play Sound Example.");
Common_Draw("Copyright (c) Firelight Technologies 2004-2023.");
Common_Draw("==================================================");
Common_Draw("");
Common_Draw("Press %s to play a mono sound (drumloop)", Common_BtnStr(BTN_ACTION1));
Common_Draw("Press %s to play a mono sound (jaguar)", Common_BtnStr(BTN_ACTION2));
Common_Draw("Press %s to play a stereo sound (swish)", Common_BtnStr(BTN_ACTION3));
Common_Draw("Press %s to quit", Common_BtnStr(BTN_QUIT));
Common_Draw("");
Common_Draw("Time %02d:%02d:%02d/%02d:%02d:%02d : %s", ms / 1000 / 60, ms / 1000 % 60, ms / 10 % 100, lenms / 1000 / 60, lenms / 1000 % 60, lenms / 10 % 100, paused ? "Paused " : playing ? "Playing" : "Stopped");
Common_Draw("Channels Playing %d", channelsplaying);
}
Common_Sleep(50);
} while (!Common_BtnPress(BTN_QUIT));
/*
Shut down
*/
result = sound1->release();
ERRCHECK(result);
result = sound2->release();
ERRCHECK(result);
result = sound3->release();
ERRCHECK(result);
result = system->close();
ERRCHECK(result);
result = system->release();
ERRCHECK(result);
Common_Close();
return 0;
}
Hope this helps!
Thank you for the help. I’ll try these things out