Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

wxWidgets - wybór pliku do odtworzenia

Ostatnio zmodyfikowano 2013-05-21 17:35
Autor Wiadomość
mojo
Temat założony przez niniejszego użytkownika
wxWidgets - wybór pliku do odtworzenia
» 2013-05-16 00:16:24
Witam, borykam się z małym (?) problemem. Na samym początku proszę o cierpliwość, wiem, że jest trochę tego tekstu, ale starałem się wszystko dostatecznie jasno wytłumaczyć. Problem sam w sobie być może okazać się prosty jeśli przeanalizujecie moją sytuację, bo nie jestem zaawansowanym programistą, uczę się tego od października i to jako dodatkowy przedmiot jedynie.


W programie moim użyłem biblioteki wxWidgets - powszechnie znana do robienia aplikacji okienkowych i malutkiej biblioteki "audiere" która to zajmuje się dźwiękiem.


Otóż napisałem taki mini sampler który po naciśnięciu klawiszy odgrywa przypisane im dźwięki. Znajdują się one na dysku komputera oczywiście. Dźwięki przypisałem manualnie w kodzie i wprowadziłem ścieżkę do obiektu biblioteki audiere:

C/C++
AudioDevicePtr audiodevice( OpenDevice() ); // tu chodzi chyba o dostęp do karty
/* dźwiękowej, każdy dźwięk  przy          "wywołaniu" w kodzie z tego korzysta (audiodevice - nazwa którą sami nadajemy)*/

sound[ 'R' ] = OpenSoundEffect( audiodevice, "C:/Users/samsung/Desktop/Synth Effects/FX-RISEUP.wav", audiere::MULTIPLE );
 
Objaśnienie: sound to mapa która wiąże klawisz z dźwiękiem. Obydwie linijki znajdują się w konstruktorze klasy która dzidziczy z wxFrame: public . Klasa tą utworzyłem, żeby posługując się biblioteką okienkową, tworzyć w niej okno, przyciski, i inne rzeczy wyświetlane w okienku.

Chciałem, żeby w programie użytkownik sam mógł wybrać jaki plik przypisze do klawisza, w tym celu umieściłem wxFileDialog (eksplorator do wyboru plików z dysku) i połączyłem jego naciśnięcie z taką funkcją składową klasy bito_blaster:

C/C++
void bito_blaster::WybierzPlik( wxCommandEvent & event ) {
   
    okno_wyboru->ShowModal();
    string path = okno_wyboru->GetPath();
    string klawisze = "ASDFHJKLXCBN";
    wxString path2 = MakePath( path );
    if( lista_klawiszy->GetSelection() != - 1 ) {
        sound[ klawisze[ lista_klawiszy->GetSelection() ] ] = OpenSoundEffect( audiodevice, path2,
        audiere::MULTIPLE );
       
        tekst->SetLabel( "Wybrales klawisz: " + num2str( lista_klawiszy->GetSelection() ) + "\n sciezka: " + path2 );
    }
    else { tekst->SetLabel( "WYBIERZ KLAWISZ DO PRZYPISANIA" ); }
}

//tekst - pomocniczy tekst do sprawdzania czy wszystko ok
//lista_klawiszy - wxListBox wybierasz klawisz do ktorego bedzie przypisane
okno_wyboru- wxFileDialog - wybierasz plik, funkcja getPath zwraca dobrą ścieżkę, sprawdzałem
(MakePath() zwraca string i jedynie zamienia \ na / w ścieżce, bo takie ukośniki są wymagane)

Niestety jak wywołuje w programie funkcje WybierzPlik, to następnie po naciśnięciu klawisza do którego przypisałem dźwięk program się zawiesza. Co mogę robić źle? To jakiś problem z pamięcią, w złym miejscu konstruuje jakiś z obiektów klasy audiere do odtwarzania dźwięku? Co może być nie tak, proszę o pomoc.
P-83050
DejaVu
» 2013-05-21 17:35:47
Uruchom aplikację w trybie debugowania i jeżeli aplikacja się wysypuje to z miejsca pokaże Ci gdzie masz problem (jeżeli używasz Visual C++).

Druga opcja: wykomentuj fragmenty kodu źródłowego, które wykonują się po wciśnięciu klawisza i sprawdź czy aplikacja się nie zawiesza. Taką metodą można również zlokalizować miejsce błędu.
C/C++
sound[ klawisze[ lista_klawiszy->GetSelection() ] ] =(...);
Nie wiemy jakich typów są Twoje zmienne, więc nie jesteśmy w stanie nic więcej doradzić.
P-83526
« 1 »
  Strona 1 z 1