• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Odtwarzanie dźwięku w C++

Object Storage Arubacloud
0 głosów
736 wizyt
pytanie zadane 29 kwietnia 2020 w C i C++ przez Rajzok Początkujący (390 p.)
edycja 30 kwietnia 2020 przez Rajzok

Cześć, mój problem wygląda następująco. Od razu powiem, że przeczesałem całe to forum, jak i inne, lecz nie znalazłem odpowiedzi sad.

Tworzę program w C++, w którym będzie odgrywany dźwięk z pliku. wav. Moje IDE: Code::Blocks, kompilator MinGW, GCC od Stonemana. Niestety przy kompilowaniu programu GCC informuje, że:

undefined reference to `PlaySoundA@12'|

Dlatego dodałem plik dźwiękowy do lokalizacji z plikiem .exe (bo wcześniej zapomniałem). Nic to jednak nie dało.  Z tego, co wyczytałem, funkcja ta wymaga biblioteki winmm.lib. Wobec tego dodałem #include <winmm.lib> , lecz nic to nie dało. Zacząłem więc szukać po plikach CodeBlocksa takiej biblioteki, lecz nie znalazłem. Być może gdzieś jest, ale najprawdopodobniej jej nie ma, dlatego nie działa.

Mniej więcej wiem, jak bibliotekę w CodeBlocksie do GCC dodać, tylko nie wiem, skąd ją mogę pobrać. Na microsoftowym MDCN nie znalazłem takiej możliwości (strona już jest przestarzała i zastąpiona nową). Czy ktoś wie, gdzie można bezpiecznie się w takową bibliotekę zaopatrzyć? I czy to wystarczy, aby funkcja PlaySound zadziałała? Dodaję poniżej mój kod:

#include <iostream>
#include <windows.h>
#include <winbase.h>
#include <cstdio>

using namespace std;

int choice;

int main()
{
    cout << "------Słowak Bell v1.0------" << endl;
    cout << "by TDomek" << endl;
    cout << "________________________" << endl;
    cout << "Aktualny status: /Działa w tle/" << endl;
    cout << "Aby działał w tle, musi być cały czas włączony" << endl;
    cout << "(zminimalizuj na pasek zadań)." << endl;
    cout << "Aby zakończyć działanie programu," << endl;
    cout << "wprowadź cyfrę 0 i zatwierdź ENTERem: ";

    while (choice!=0)
    {
        SYSTEMTIME st;
        GetSystemTime(&st);

        if ((st.wHour == 7) && (st.wMinute == 35))
        {
            PlaySound(TEXT("schoolbell.wav"), NULL, SND_FILENAME);
            Sleep(58000);
        }

        if ((st.wHour == 8) && (st.wMinute == 20) && (st.wSecond == 1))
        {
            PlaySound(TEXT("schoolbell.wav"), NULL, SND_FILENAME);
        }

        if ((st.wHour == 8) && (st.wMinute == 30) && (st.wSecond == 1))
        {
            PlaySound(TEXT("schoolbell.wav"), NULL, SND_FILENAME);
        }

        if ((st.wHour == 9) && (st.wMinute == 15) && (st.wSecond == 1))
        {
            PlaySound(TEXT("schoolbell.wav"), NULL, SND_FILENAME);
        }

        if ((st.wHour == 9) && (st.wMinute == 25) && (st.wSecond == 1))
        {
            PlaySound(TEXT("schoolbell.wav"), NULL, SND_FILENAME);
        }

        if ((st.wHour == 10) && (st.wMinute == 10) && (st.wSecond == 1))
        {
            PlaySound(TEXT("schoolbell.wav"), NULL, SND_FILENAME);
        }

        if ((st.wHour == 10) && (st.wMinute == 20) && (st.wSecond == 1))
        {
            PlaySound(TEXT("schoolbell.wav"), NULL, SND_FILENAME);
        }

        if ((st.wHour == 11) && (st.wMinute == 5) && (st.wSecond == 1))
        {
            PlaySound(TEXT("schoolbell.wav"), NULL, SND_FILENAME);
        }

        if ((st.wHour == 11) && (st.wMinute == 25) && (st.wSecond == 1))
        {
            PlaySound(TEXT("schoolbell.wav"), NULL, SND_FILENAME);
        }

        if ((st.wHour == 12) && (st.wMinute == 10) && (st.wSecond == 1))
        {
            PlaySound(TEXT("schoolbell.wav"), NULL, SND_FILENAME);
        }

        if ((st.wHour == 12) && (st.wMinute == 30) && (st.wSecond == 1))
        {
            PlaySound(TEXT("schoolbell.wav"), NULL, SND_FILENAME);
        }

        if ((st.wHour == 13) && (st.wMinute == 15) && (st.wSecond == 1))
        {
            PlaySound(TEXT("schoolbell.wav"), NULL, SND_FILENAME);
        }

        if ((st.wHour == 13) && (st.wMinute == 25) && (st.wSecond == 1))
        {
            PlaySound(TEXT("schoolbell.wav"), NULL, SND_FILENAME);
        }

        if ((st.wHour == 14) && (st.wMinute == 10) && (st.wSecond == 1))
        {
            PlaySound(TEXT("schoolbell.wav"), NULL, SND_FILENAME);
        }

        if ((st.wHour == 14) && (st.wMinute == 20) && (st.wSecond == 1))
        {
            PlaySound(TEXT("schoolbell.wav"), NULL, SND_FILENAME);
        }

        if ((st.wHour == 15) && (st.wMinute == 5) && (st.wSecond == 1))
        {
            PlaySound(TEXT("schoolbell.wav"), NULL, SND_FILENAME);
        }

        cin >> choice;


    }

    if(choice==0)
       {
           getchar(); getchar();
       }

    return 0;
}

Z góry wielkie dzięki za porady smiley

komentarz 30 kwietnia 2020 przez DragonCoder Nałogowiec (36,500 p.)
https://stackoverflow.com/questions/9961949/playsound-in-c-console-application

nie wiem, czy to juz czytales, ale include .lib raczej nie zadziala. Musisz zlinkowac ja w opcjach, tak jak jest napisane chyba tam w jednym z komentarzy.
komentarz 30 kwietnia 2020 przez Rajzok Początkujący (390 p.)
Ok, zrobiłem tak i funkcja PlaySound już działa. Problem tylko, że nie działa o określonych w kodzie porach.
komentarz 30 kwietnia 2020 przez DragonCoder Nałogowiec (36,500 p.)
Co znsczy pora?
komentarz 30 kwietnia 2020 przez Rajzok Początkujący (390 p.)
Chodziło mi o to, że ma się dźwięk włączać o określonych godzinach.

2 odpowiedzi

+1 głos
odpowiedź 30 kwietnia 2020 przez j23 Mędrzec (194,920 p.)
wybrane 8 maja 2020 przez Rajzok
 
Najlepsza

Z tego, co wyczytałem, funkcja ta wymaga biblioteki winmm.lib. Wobec tego dodałem #include <winmm.lib>

Trzy sprawy:

  • pliki .lib to pliki Visual C++ lub C++ Buildera. MinGW używa plików .a
  • plików bibliotek nie załączasz dyrektywą #include - ona służy do załączania plików nagłówkowych.
  • dołącz w opcjach projektu bibliotekę winmm (ewentualnie podaj pełną nazwę libwinmm.a)
komentarz 30 kwietnia 2020 przez Rajzok Początkujący (390 p.)

Dodałem tą bibliotekę tak jak mówiłeś i funkcja PlaySound teraz działa smiley

Jest tylko jeden problem. Dźwięk ma się rozpoczynać o wskazanej porze, jednak wtedy nic się nie dzieje. jak to naprawić?

1
komentarz 30 kwietnia 2020 przez j23 Mędrzec (194,920 p.)
edycja 30 kwietnia 2020 przez j23

Nie działa, bo masz w linii 107 oczekiwanie na input od użytkownika. Spróbuj może z funkcją GetKeyState. Następna rzecz to to, że próbujesz trafić co do sekundy - to nie (zawsze) zadziała. Powinieneś raczej sprawdzać, czy aktualny czas nie przekroczył danej ilości sekund.

Widzę to tak:

struct AlarmTime {
    size_t h, m, s;
};


std::vector<AlarmTime> times = {
	{ 7, 35, 0 },
	{ 8, 20, 1 },
	{ 8, 30, 1 },
	{ 9, 15, 1 },
	{ 9, 25, 1 },
	{ 10, 10, 1 },
	{ 10, 20, 1 },
	{ 11, 5, 1 },
	{ 11, 25, 1 },
	{ 12, 10, 1 },
	{ 12, 30, 1 },
	{ 13, 15, 1 },
	{ 13, 25, 1 },
	{ 14, 10, 1 },
	{ 14, 20, 1 },
	{ 15, 5, 1 }
};


SYSTEMTIME st;
size_t currentAlarm = 0;

while (currentAlarm < times.size()) {
	GetSystemTime(&st);

	while(currentAlarm < times.size()) {
		AlarmTime& at = times[currentAlarm];

		if (st.wHour > at.h || (st.wHour == at.h && st.wMinute > at.m)) ++currentAlarm;
		else if (st.wHour == at.h && st.wMinute == at.m && st.wSecond >= at.s) {
			PlaySound(TEXT("schoolbell.wav"), NULL, SND_FILENAME);
			++currentAlarm;
		}
		else break;
	}

	Sleep(500);
}

 

komentarz 30 kwietnia 2020 przez Rajzok Początkujący (390 p.)

Dziękismiley

Wkleiłem ten kod, lecz kompilator stwierdził, że zmienna times w 6 linijce nie została zadeklarowana.

Oj, jednak widzę, że jeśli chcę dalej programy w c++ robić, to bez wiedzy o strukturach danych się raczej nie obędzie... wink

komentarz 1 maja 2020 przez j23 Mędrzec (194,920 p.)

Powinieneś załączyć plik <vector>.

komentarz 8 maja 2020 przez Rajzok Początkujący (390 p.)
Załączyłem ten plik, lecz kompilator nie umie przekonwertować czegoś. Oto jego wiadomość:

C:\Users\Tomasz\Documents\Programy\School Bell\main.cpp|30|error: could not convert '{{7, 35, 0}, {8, 20, 1}, {8, 30, 1}, {9, 15, 1}, {9, 25, 1}, {10, 10, 1}, {10, 20, 1}, {11, 5, 1}, {11, 25, 1}, {12, 10, 1}, {12, 30, 1}, {13, 15, 1}, {13, 25, 1}, {14, 10, 1}, {14, 20, 1}, {15, 5, 1}}' from '<brace-enclosed initializer list>' to 'std::vector<AlarmTime>'|
komentarz 8 maja 2020 przez j23 Mędrzec (194,920 p.)
Hmm... Zapis jest poprawny. Włączyłeś w opcjach projektu obsługę przynajmniej C++14?
komentarz 8 maja 2020 przez Rajzok Początkujący (390 p.)
A gdzie to można sprawdzić? Przeszukałem Code Blocksa ale nie znalazłem tego nigdzie.
1
komentarz 8 maja 2020 przez j23 Mędrzec (194,920 p.)
Tak wygląda to nigdzie: Project ► Build options ► Compiler settings ► Compiler flags
komentarz 8 maja 2020 przez Rajzok Początkujący (390 p.)

Znalazłem, pomogło. Dzięki wielkie smiley

+1 głos
odpowiedź 29 kwietnia 2020 przez veron_v Obywatel (1,360 p.)
edycja 29 kwietnia 2020 przez veron_v

Witaj serdecznie kolego. Jeśli mogę Ci coś doradzić, choć sam jestem początkującym programistą, z moich subiektywnych odczuć wniosek jest jeden. Zaopatrz się w Visual Studio Code. Bardzo przyjazne środowisko. Mega dużo różnych i przede wszystkim darmowych wtyczek. Ogrom możliwości do personalizacji i jest na czasie. Tak jak wspomniałeś, CodeBlock jest dość przestarzałą technologią. A VSCode jest lekki i przyjemny w użyciu i nie boryka się z problemami starczymi :) Pozdrawiam serdecznie. Powodzonka w kodzeniu.

UP. Ewentualnie jeśli bardzo nie chcesz zmienić IDE, to tu podsyłam Ci Link który udało mi się znaleźć z plikiem którego poszukujesz. http://www.dlldownloader.com/winmm-dll/

komentarz 30 kwietnia 2020 przez j23 Mędrzec (194,920 p.)
Rzecz w tym, że VSC to edytor a nie IDE. Jego problem leży w innym miejscu.
komentarz 30 kwietnia 2020 przez Rajzok Początkujący (390 p.)

@veron_v, ściągnąłem Visuala, jednak to niestety nic nie dało. Udało mi się jednak w Code Blocksie zrobić tak, żeby PlaySound działało. Problem tkwi jednak w tym, że dźwięk nie odpala się wtedy kiedy powinien. Jak można to naprawić?

komentarz 30 kwietnia 2020 przez veron_v Obywatel (1,360 p.)

@j23, Możliwe że masz rację. Nie wiem nie wypowiem się bo za mało jeszcze wiem. A odnośnie edytora.. Codeblock też jest tylko edytorem. W połączeniu z MinGW stanowi IDE czyli na tej samej zasadzie co VSC. Czy się mylę ?

komentarz 1 maja 2020 przez j23 Mędrzec (194,920 p.)
Nie jest tylko edytorem, bo masz w nim integrację z debuggerem, konfigurację projektu, własny format projektu itd. Dlatego to się nazywa zintegrowane środowisko programistyczne.

VSC jest edytorem, którego funkcjonalność możesz rozszerzyć o wspomniane elementy. No ale one nie są integralna częścią tego programu.

Podobne pytania

+1 głos
1 odpowiedź 651 wizyt
+1 głos
2 odpowiedzi 97 wizyt
pytanie zadane 26 listopada 2020 w C i C++ przez Gohard Nowicjusz (150 p.)
0 głosów
2 odpowiedzi 805 wizyt
pytanie zadane 20 kwietnia 2016 w C i C++ przez Urbiacz Nowicjusz (120 p.)

92,575 zapytań

141,424 odpowiedzi

319,649 komentarzy

61,960 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...