BASS Library - Decoding Channel 4928 9

O temacie

Autor Siemekk

Zaczęty 20.05.2017 roku

Wyświetleń 4928

Odpowiedzi 9

Siemekk

Siemekk

Złote Wrota
Untersturmfuhrer
posty2143
Propsy1151
ProfesjaProgramista
  • Złote Wrota
  • Untersturmfuhrer
Mam taki mały problem - otóż używam biblioteki BASS, problem pojawia się gdy chcę przerwać odtwarzanie starego dźwięku i zagrać nowy plik mp3.
Init_Bass();

string sound = Music_GetFolder(file);
BASS_StreamFree(current);
current = BASS_StreamCreateFile(false, sound.c_str(), 0, 0, BASS_SAMPLE_LOOP);
BASS_ChannelSetPosition(current, 10000, BASS_POS_DECODETO);

cout << BASS_ErrorGetCode() << endl;

BASS_ChannelPlay(current,  false);
Przy odpaleniu muzyki za pierwszym razem dźwięk się pojawia. Lecz gdy dany utwór ma zostać zmieniony na inny to muzyka jest przerywana,  lecz nowy utwór muzyczny nie jest grany. W dodatku w konsoli widnieje liczba 37 co oznacza błąd:
BASS_ERROR_NOTAVAIL Only decoding channels (BASS_STREAM_DECODE) are allowed when using the "no sound" device. The BASS_STREAM_AUTOFREE flag is also unavailable to decoding channels.
Moje pytanie jest następujące - skoro kanał jest dekodujący, to jak mam sprawić by owym nie był? W necie poszukałem i znalazłem użycie funkcji BASS_ChannelSetPosition, lecz nie wiem jak się z tym obsłużyć. Domyślam się, że gdzieś to jest na internecie, ale ja jestem zbyt głupi by to znaleźć :F Byłbym wdzięczny za pomoc :)
 

P.S A Splash w szafie i nie ma psychy by mi dać bana.

Wonski

Wonski

Gry (themodders@telegram)
radio engineer
posty256
Propsy91
ProfesjaProgramista
  • Gry (themodders@telegram)
  • radio engineer

Wonski
Gry (themodders@telegram)

BASS Library - Decoding Channel
#1 2017-05-20, 23:00(Ostatnia zmiana: 2017-05-20, 23:15)
Jakiego typu jest current? Musiałeś zadeklarować tą zmienną przed funkcją Init_Bass().
Sądząc po nazwie funkcji Music_GetFolder(), raczej nie pochodzi ona z libki BASS?
Widzę, że używasz gdzieś using namespace std, to samo dla libki BASS i być może jeszcze dla innej. To jest zła praktyka, szczególnie jak mieszasz kod z różnych bibliotek w jednym pliku. Znacznie pogarsza czytelność, nie wiadomo co nalezy do standardu, co jest zdefiniowane przez Ciebie, a co pochodzi z BASS. Wyobraź sobie, że ktoś przejmuje ten kod od Ciebie i ma z nim pracować... :) Znacznie lepszym rozwiązaniem jest jednak dodawanie tych przedrostków.

Do czego służy funkcja BASS_StreamFree()? Zwraca coś?
BASS_ChanelPlay() służy do odtwarzania dźwięku? Zwraca coś? Jakiś uchwyt do zasobu? Może ten zasób należy zwolnić, zanim odtworzysz kolejny dźwięk?
Ogólnie napisz coś więcej na temat tego kodu, wątpię by komuś chciało się grzebać po internecie i szukać dokumentacji :D Ewentualnie podaj link do dokumentacji.
 

Siemekk

Siemekk

Złote Wrota
Untersturmfuhrer
posty2143
Propsy1151
ProfesjaProgramista
  • Złote Wrota
  • Untersturmfuhrer
Zmienna current jest to zmienna globalna typu HSTREAM, funkcja Music_GetFolder() zawraca stringa z lokacją pliku muzycznego. Co do funkcji BASS'u to BASS_ChannelPlay i BASS_StreamFree zawracają BOOL. Próbowałem zwolnić zasoby, lecz nie działa to w taki sposób jak należy - nic się nie odtwarza. I tak jak wyżej wyskakuje błąd BASS_ERROR_NOTAVAIL Only decoding channels (BASS_STREAM_DECODE) are allowed when using the "no sound" device. The BASS_STREAM_AUTOFREE flag is also unavailable to decoding channels. Co do sposobu zapisu kodu - na obecną chwilę chciałbym aby kod w ogóle działał potem zajmę się komentarzami i porządkowaniem kodu. I jeszcze jedno - Dokumentacja BASS
 

P.S A Splash w szafie i nie ma psychy by mi dać bana.

Wonski

Wonski

Gry (themodders@telegram)
radio engineer
posty256
Propsy91
ProfesjaProgramista
  • Gry (themodders@telegram)
  • radio engineer
Z tego co jest w dokumentacji, a czego nie widzę u Ciebie w tym fragmencie kodu, to powinieneś rozważyć użycie funkcji BASS_MusicLoad() oraz BASS_MusicFree() wraz z BASS_ChannelPlay() i BASS_ChannelStop().

Ogólnie jak ściągasz archiwum z tą biblioteką to po wypakowaniu masz plik bass.txt, a w nim spis plików wraz z przykładami użycia (co jest w każdej lepszej libce). Zainteresuj się plikami basstest.c i custloop.c.

Powiedz mi jeszcze w którym momencie zmieniasz dźwięk, który odtwarzasz? Ten kod, który pokazałeś jest ciałem jakiejś metody/funkcji, którą gdzieś w pętli wywołujesz?
Wg mnie po prostu nie zwalniasz zasobu i stąd problem.
Sprawdź czy nie możesz przekazywać kilku flag przy pomocy operatora "|".
 

Siemekk

Siemekk

Złote Wrota
Untersturmfuhrer
posty2143
Propsy1151
ProfesjaProgramista
  • Złote Wrota
  • Untersturmfuhrer
Operatory logiczne działają, ponieważ w dokumentacji jest napisane że można je łączyć za pomocą "|". Funkcję wywołuję poprzez Bind (Jest to biblioteka podczepiona do G2 przez Ikarusa) W najbliższym czasie powstanie funkcja *_Tidy która będzie odpowiedzialna za czyszczenie strumienia, jednak teraz chciałbym wiedzieć jak zrobić by muzyka była szybko zmieniana. W Czasie Zapłaty ork zrobił system który działał. Z pomocą IDA dowiedziałem się, że użył tych funkcji:
BASS_StreamFree       
BASS_ChannelSlideAttribute
BASS_StreamCreateFile   
BASS_ErrorGetCode       
BASS_ChannelSetPosition   
BASS_ChannelPlay       
BASS_ChannelSetAttribute
BASS_ChannelGetPosition 
BASS_ChannelBytes2Seconds 
BASS_ChannelIsSliding     
BASS_Init               
Nie wiem, może funkcja BASS_SetPosition pomogłaby rozwiązać problem :hmmm:
 

P.S A Splash w szafie i nie ma psychy by mi dać bana.

Wonski

Wonski

Gry (themodders@telegram)
radio engineer
posty256
Propsy91
ProfesjaProgramista
  • Gry (themodders@telegram)
  • radio engineer
Wieczorem pobawię się tym i powiem Ci co i jak.
Zedytuję tego posta i dam Ci odpowiedź.
 

Siemekk

Siemekk

Złote Wrota
Untersturmfuhrer
posty2143
Propsy1151
ProfesjaProgramista
  • Złote Wrota
  • Untersturmfuhrer
@Refresh :F
 

P.S A Splash w szafie i nie ma psychy by mi dać bana.

Wonski

Wonski

Gry (themodders@telegram)
radio engineer
posty256
Propsy91
ProfesjaProgramista
  • Gry (themodders@telegram)
  • radio engineer
Sorry :D Kompletnie o tym zapomniałem :D
Daj mi chwilę to zobaczę co i jak jeszcze raz.
 

Wonski

Wonski

Gry (themodders@telegram)
radio engineer
posty256
Propsy91
ProfesjaProgramista
  • Gry (themodders@telegram)
  • radio engineer
Przepraszam, że tak długo, ale miałem cały czas coś do roboty i nie mogłem zebrać się, przysiąść i pomyśleć nad tym :D

Testowałem u siebie kod
streamHandle = BASS_SampleLoad(FALSE, "pitbull-give-me-everything.mp3", 0, 0, 0);
channel = BASS_SampleGetChannel(streamHandle, FALSE);
BASS_SampleFree(streamHandle);
,który oczywiście jest mocno testowy i pokazowy, ale u mnie działa.
Tzn można zmieniać odtwarzany dźwięk i słychać go w głośniach.

Tutaj gość miał nieco inny (ale podobny) problem, więc masz dobry przykład:
https://stackoverflow.com/questions/7180920/bass-play-a-stream

Piszą tam również o możliwości resetowania kanału, jednak ja takiej funkcjonalności nie znalazłem.
http://www.un4seen.com/doc/#bass/BASS_ChannelPlay.html
http://www.un4seen.com/doc/#bass/BASS_ChannelSetPosition.html

Moim zdaniem strasznie ciężka do obsługi ta libka. Jest nieobiektowa :D

Pisałem wcześniej:
Cytuj
Z tego co jest w dokumentacji, a czego nie widzę u Ciebie w tym fragmencie kodu, to powinieneś rozważyć użycie funkcji BASS_MusicLoad() oraz BASS_MusicFree() wraz z BASS_ChannelPlay() i BASS_ChannelStop().
Eksperymentowałeś coś z tym?
Swoją drogą tyle czasu minęło i mogłeś coś sam wymyślić :)
 

Siemekk

Siemekk

Złote Wrota
Untersturmfuhrer
posty2143
Propsy1151
ProfesjaProgramista
  • Złote Wrota
  • Untersturmfuhrer
Tak eksperymentowałem :D Stworzyłem trzy kanały "Current" "Last" i "ToChange", gdy chciałem zmienić kanał to podmieniłem kanał "Current" na "ToChange", wtedy działało.
//Kod
Current = ToChange;
ToChange = NULL;
Bass_ChannelSlide(...);
Mimo to dzięki za pomoc i myślę, że temat można zamknąć :ok:
 

P.S A Splash w szafie i nie ma psychy by mi dać bana.


0 użytkowników i 1 Gość przegląda ten wątek.
0 użytkowników
Do góry