2 Sep '10 - 20:17 *
Welcome, Guest. Please login or register.
Did you miss your activation email?

Login with username, password and session length
 
   Home   Help Search Login Register  
Pages: [1]
  Reply  |  Print  
Author Topic: 2 quick questions  (Read 9090 times)
new guy
Guest
« on: 1 Jul '03 - 16:24 »
Reply with quoteQuote

1. In the bass documentation it says that if you use the BASS_ChannelSetFX function without the FX flag you can turn the effects on/off dynamically (ie. you don't have to stop and restart the stream first) and I was wanting to know what do they mean by the FX flag because I cannot find any info on it in the docs other then that you can trun it on/off.


2. I know how to create a crossfader using 2 channels (slide one down while sliding the other up...) but how would I do it just using one channel in delphi ?
Logged
XMinioNX
Posts: 959


« Reply #1 on: 1 Jul '03 - 18:08 »
Reply with quoteQuote

Quote

1. In the bass documentation it says that if you use the BASS_ChannelSetFX function without the FX flag you can turn the effects on/off dynamically (ie. you don't have to stop and restart the stream first) and I was wanting to know what do they mean by the FX flag because I cannot find any info on it in the docs other then that you can trun it on/off.
The FX flag is BASS_SAMPLE_FX, this flag you would use it when loading a Stream, Sample or Music, but its a disadvantage if you just want to dynamically change effects.

Quote

2. I know how to create a crossfader using 2 channels (slide one down while sliding the other up...) but how would I do it just using one channel in delphi ?
Well, to achieve this, set the the first stream to Auto Free, then the volume attribute of BASS_ChannelSlideAttribute set it to -2, which means Slide volume to 0, and then Stop. This if this auto free stream is Stopped, then it is fred, this way you can start sliding the channel, disregard its handle (you wont need it anymore as it will be freed) and then start your new stream.

--------------------------------
Check this thread out, maybe you'll get an idea, http://www.un4seen.com/YaBB.cgi?board=bass&action=display&num=1037047491
« Last Edit: 1 Jul '03 - 18:13 by XMinioNX » Logged
new guy
Guest
« Reply #2 on: 1 Jul '03 - 21:06 »
Reply with quoteQuote

As Far as the FX flag being set I guess I had it unset all the time (ie. I did not add it when I created the stream) but I cannot add and remove effects at any time as the docs suggest.

Here is the code I am using to add/remove the effects


procedure TForm1.CheckBox1Click(Sender: TObject);
begin
if checkbox1.Checked = True then
Bass_ChannelSetFX(Stream,Bass_FX_Flanger)
else
Bass_ChannelRemoveFX(Stream,Bass_FX_Flanger);
end;



As far as the crossfader goes I don't really get it at all because how can you slide a channel that has been stopped already. I looked at the code in the link you provided and tried to do something with it but it did not do anything. Maybe it would help if I explained my situation so here goes.

When my form is created I load a directory of mp3's (about 2300) into a listbox and when I click on one of the songs in the list it plays and so on an so forth. What I want is if I click on a song while another one is playing to fade out that song while the one I just clicked on fades in at the same time (ie. crossfade) I want to do this using only one stream handle because this is just one of 6 ways I am loading and playing songs and it could get very confusing very quickly if I used more then one handle.

Anyway here is the code I tried using so you can see where my mistake could be.


procedure TForm1.ListBox1Click(Sender: TObject);
Var
Stream : HSTREAM;
begin

Bass_ChannelStop(Stream);

Stream := Bass_StreamCreateFile(FALSE,pChar(listbox1.Items.Strings[listbox1.ItemIndex]), 0, 0,BASS_STREAM_AUTOFREE);

Bass_StreamPlay(Stream, FALSE, 0);

Bass_channelslideattributes(stream,-1,-2,-101,1500);

Stream := Bass_StreamCreateFile(FALSE,pChar(listbox1.Items.Strings[listbox1.ItemIndex]), 0, 0,0);

Bass_StreamPlay(Stream, FALSE, 0);

end;
Logged
new guy
Guest
« Reply #3 on: 2 Jul '03 - 11:11 »
Reply with quoteQuote

So I take it from the lack of further replies that the code I am using should be working or close enough so that nobody can find any errors in it ?

If that is the case then would anyone care to guess at what the problem might be.
Logged
Ian @ un4seen
Administrator
Posts: 11289


« Reply #4 on: 2 Jul '03 - 13:18 »
Reply with quoteQuote

Try this...

procedure TForm1.ListBox1Click(Sender: TObject);
begin
// fade-out old
  BASS_ChannelSlideAttributes(Stream, -1, -2, -101, 1500);
// create new
  Stream := BASS_StreamCreateFile(FALSE, pChar(listbox1.Items.Strings[listbox1.ItemIndex]), 0, 0, BASS_STREAM_AUTOFREE);
// fade-in
  BASS_ChannelSetAttributes(Stream, -1, 0, -101);
  BASS_ChannelSlideAttributes(Stream, -1, 100, -101, 1500);
  BASS_StreamPlay(Stream, FALSE, 0);
end;

"Stream" should be a global variable... that also explains why your "SetFX" call didn't work.

Logged
DanaPaul
Posts: 335


« Reply #5 on: 2 Jul '03 - 17:56 »
Reply with quoteQuote


Quote

I want to do this using only one stream handle because this is just one of 6 ways I am loading and playing songs and it could get very confusing very quickly if I used more then one handle.


Along with the previous reply, you may be interested in  taking a look at multiple instance Bass, BassCD, and BassWMA header files.  All Delphi versions supported, and all Bass instances are dynamically loaded.  These header files utilise an array of (Bass) function pointers offering the developer a simple and easy to use solution for Bass multi functionality, ie: Decoding while Encoding, etc.

http://members.aol.com/wtgdana/private/Bass/


Logged
new guy
Guest
« Reply #6 on: 2 Jul '03 - 21:01 »
Reply with quoteQuote

Ok the crossfader worked but even after setting the handle name as a global variable the SetFX function still does not work. I made sure to remove it from where it was originally and I even went so far as to create a new test program and it still does not work.
Logged
Ian @ un4seen
Administrator
Posts: 11289


« Reply #7 on: 3 Jul '03 - 13:51 »
Reply with quoteQuote

Check the BASS_ChannelSetFX return value to see if the call failed, and if it has, use BASS_ErrorGetCode to get the reason for the failure... it'll help reduce the guessing games Smiley

Also, note that the "FX" functions require DX8 (or above) to be installed, so make sure you have that.
Logged
new guy
Guest
« Reply #8 on: 3 Jul '03 - 22:47 »
Reply with quoteQuote

Ok I did as you said and when I checked on the checckbox (enabled the FX) the error code returned was 0 which I am guessing is ok.

Unchecking the checkbox (disabled the FX) the error code returned was 5 which if I am reading things right is the BASS_ERROR_UNKNOWN so I guess that narrows it down abit Smiley

I have windows xp which comes with DX 8.1 so the DX version is fine.
Logged
new guy
Guest
« Reply #9 on: 4 Jul '03 - 10:47 »
Reply with quoteQuote

I think I made a mistake when checking for the return value of the call (am also new to delphi) so this is the new code I am using which I hope is the correct way of getting the return values of the call.


procedure TForm1.Button7Click(Sender: TObject);
begin
BASS_ChannelSetFX(song,bass_fx_flanger);
label10.Caption := inttostr(BASS_ChannelSetFX(song,bass_fx_flanger));
end;

The code to add the effect and show it's return value on a label



procedure TForm1.Button8Click(Sender: TObject);
begin
BASS_ChannelRemoveFX(song,bass_fx_flanger);
label10.Caption := booltostr(bass_channelremoveFX(song,bass_fx_flanger));
end;

The code to remove the effect and show it's return value on a label




procedure TForm1.Button9Click(Sender: TObject);
begin
label10.Caption:= inttostr(bass_errorGetCode());
end;

the code to get the last error code returned by bass and show it on a label


Here are my results...

If I click on the button to add the effect without first starting the stream the return value is 0 and the error code is 5.

If I click on the the button to add the effect when a song is streaming the return value is 3758096390 which I am assuming is the handle of the flanger effect and the error code is 0.

If I click on the button to remove the effect without first starting the stream the return value is 0 and the error code is 5 (just like when adding the effect)

If I click on the the button to remove the effect when a song is streaming the return value is 0 and the error code is 0 but the effect is never removed.

Again I hope this is the correct way of checking the return values and hope it helps finding a answer to my problem.
Logged
Ian @ un4seen
Administrator
Posts: 11289


« Reply #10 on: 4 Jul '03 - 14:29 »
Reply with quoteQuote

Ok, that looks like the BASS_ChannelSetFX call is successful. Do you not hear the effect? If not, can you hear the effects in either the FXTEST or SYNTH precompiled examples?

The reason for the BASS_ChannelRemoveFX failure is that you need to use the handle that you got from the BASS_ChannelSetFX call in the 2nd parameter, not the type of FX. (error code 5 = BASS_ERROR_HANDLE)
Logged
new guy
Guest
« Reply #11 on: 4 Jul '03 - 19:48 »
Reply with quoteQuote

yes I hear the effect I have always been able to hear it. It's the unsetting of the effect that does not seem to work even after doing as you said and using the returned handle for the effect as the 2nd parameter in the Bass_ChannelRemoveFX call. The effect is simply not removed.

here is the code I used to test it with I realize in the final version I will have to setup a variable to store the fx handle but for now I just wanted to test it with the hardcoded value that was returned.


procedure TForm1.Button8Click(Sender: TObject);
begin
BASS_ChannelRemoveFX(song,3758096390);
label10.Caption := booltostr(bass_channelremoveFX(song,bass_fx_flanger));
end;
Logged
new guy
Guest
« Reply #12 on: 5 Jul '03 - 07:29 »
Reply with quoteQuote

Am I doing this correct or is my code totally wrong. I mean if (3758096390) is the handle that is returned in the SetFX call is it not the handle I need to use when Removing the effect or is there something i'm missing here.
Logged
Ian @ un4seen
Administrator
Posts: 11289


« Reply #13 on: 6 Jul '03 - 15:19 »
Reply with quoteQuote

You just need to store the handle that BASS_ChannelSetFX returns, and use it when you call BASS_ChannelRemoveFX.
Logged
new guy
Guest
« Reply #14 on: 6 Jul '03 - 19:01 »
Reply with quoteQuote

Is that not what I was doing ? If not then I have no idea how to do it.
Logged
XMinioNX
Posts: 959


« Reply #15 on: 7 Jul '03 - 02:51 »
Reply with quoteQuote

You have to have a global variable to store the handle in, the handle will change on each call to BASS_ChannelSetFX. This handle you save, is the one you pass to BASS_ChannelRemoveFX
Logged
Pages: [1]
  Reply  |  Print  
 
Jump to:  

Powered by SMF 1.1.11 | SMF © 2006-2009, Simple Machines LLC
Page created in 0.049 seconds with 15 queries.