Skocz do zawartości

C/C++ Wydobycie Dźwięku/Melodii


Subaru

Rekomendowane odpowiedzi

Moje niedopatrzenie przepraszam

Kod jest właściwie ten sam, jedynie nad "include" są wpisy licencji i takie tam

#include <unistd.h>
#include <stdio.h>
//#include <glib/glib.h>	//ciekawe czy potrzebne mu w koncu bedzie czy nie
#include <gst/gst.h>

#define MNOTE_C4 261.63
#define MNOTE_D4 293.66
#define MNOTE_E4 329.63
#define MNOTE_F4 349.23
#define MNOTE_G4 392.00
#define MNOTE_A4 440.00
#define MNOTE_H4 493.88
#define MNOTE_C5 523.25

int x;

main (int argc, char *argv[])
{
gst_init (&argc, &argv);

printf("Wybierz opcje \n");
printf("1. DMW DS (17,5 min) 2. DMW D/D (30 min) 3. Exit");
scanf("%d", x);
switch(x)
{
	case 1 : sleep(1050); play_sound (MNOTE_E4); play_sound (MNOTE_E4); play_sound (MNOTE_E4); break;
	case 2 : sleep(1800); play_sound (MNOTE_E4); play_sound (MNOTE_E4); play_sound (MNOTE_E4); break;
	case 3 : sleep(10); play_sound (MNOTE_E4); play_sound (MNOTE_E4); play_sound (MNOTE_E4); break;
	default : printf("Zla opcja"); break;
}
}

 

Od razu wyprzedzę Cię morsik, na razie próbuję doprowadzić to do działania "jakkolwiek", potem zrobię tak jak mówisz to wyliczanie i całą resztę poprawiania merytorycznego :P

Odnośnik do komentarza
Udostępnij na innych stronach

Ale jak już korzystasz z przykładu to przeczytaj chociaż ze zrozumieniem cały. W http://developer.gnome.org/gnome-devel-demos/unstable/guitar-tuner.c.html.en funkcja play_sound nie jest wbudowana w bibliotekę tylko zadeklarowana w tym przykładzie:

static void 
play_sound (gdouble frequency)
{
...
}

Odnośnik do komentarza
Udostępnij na innych stronach

Dopisałem co trzeba (static void play_sound) lecz błędy wciąż te same, w konsoli wygląda to tak:

src/Makefile.am:5: gstreamer-0.10_CFLAGS: non-POSIX variable name
src/Makefile.am:23: gstreamer-0.10_LIBS: non-POSIX variable name
Makefile.am:5: bad characters in variable name `dmw_alarmdocSHHHH5!'
Makefile.am:3: gstreamer-0.10_CFLAGS: non-POSIX variable name
make[1]: *** [Makefile.in] Błąd 1[/quote]
MakeFile został na nowo stworzony przez Anjuta (dłuuugi strasznie) jednakże chyba najbardziej znaczące teraz linijki to:
[code]GSTREAMER_CFLAGS = -pthread -I/usr/include/gstreamer-0.10 -I/usr/include/glib-2.0 -I/usr/lib64/glib-2.0/include -I/usr/include/libxml2  
GSTREAMER_LIBS = -pthread -lgstreamer-0.10 -lgobject-2.0 -lgmodule-2.0 -lxml2 -lgthread-2.0 -lrt -lglib-2.0  

Odnośnik do komentarza
Udostępnij na innych stronach

Caly widz polegana tym, ze do Makefile.am sie nie dotykalem, wszystkie pliki "typu" makefile sa robione przez Anjuta przy kompilacji, wiec wina nie jest w 100% moja (lub moze w ogole nie jest moja)

Kod programu na obecna chwile wyglada tak:

#include <unistd.h>
#include <stdio.h>
//#include <glib/glib.h>	//ciekawe czy potrzebne mu w koncu bedzie czy nie
#include <gst/gst.h>

#define MNOTE_C4 261.63
#define MNOTE_D4 293.66
#define MNOTE_E4 329.63
#define MNOTE_F4 349.23
#define MNOTE_G4 392.00
#define MNOTE_A4 440.00
#define MNOTE_H4 493.88
#define MNOTE_C5 523.25

int x;

static void 
play_sound (gdouble frequency)
{
GstElement *source, *sink;
GstElement *pipeline;

pipeline = gst_pipeline_new ("note");
source   = gst_element_factory_make ("audiotestsrc",
                                     "source");
sink     = gst_element_factory_make ("autoaudiosink",
                                     "output");

/* set frequency */
g_object_set (source, "freq", frequency, NULL);

gst_bin_add_many (GST_BIN (pipeline), source, sink, NULL);
gst_element_link (source, sink);

gst_element_set_state (pipeline, GST_STATE_PLAYING);

/* stop it after 500ms */
g_timeout_add (LENGTH, (GSourceFunc) pipeline_stop, pipeline);
}

main (int argc, char *argv[])
{
gst_init (&argc, &argv);

printf("Wybierz opcje \n");
printf("1. DMW DS (17,5 min) 2. DMW D/D (30 min) 3. Exit");
scanf("%d", x);
switch(x)
{
	case 1 : sleep(1050); play_sound (MNOTE_E4); play_sound (MNOTE_E4); play_sound (MNOTE_E4); break;
	case 2 : sleep(1800); play_sound (MNOTE_E4); play_sound (MNOTE_E4); play_sound (MNOTE_E4); break;
	case 3 : sleep(10); play_sound (MNOTE_E4); play_sound (MNOTE_E4); play_sound (MNOTE_E4); break;
	default : printf("Zla opcja"); break;
}
}

 

EDIT #1

Dorzuce na wszelki wypadek rzeczony Makefile.am

http://pastebin.com/fChZe4HM

Odnośnik do komentarza
Udostępnij na innych stronach

Jak sie nie nauczysz debugowac i czytac podpowiedzi kompilatora to niewiele w zyciu pokodzisz. Dzialajacy kod:

#include <unistd.h>
#include <stdio.h>
#include <gst/gst.h>

#define MNOTE_C4 261.63
#define MNOTE_D4 293.66
#define MNOTE_E4 329.63
#define MNOTE_F4 349.23
#define MNOTE_G4 392.00
#define MNOTE_A4 440.00
#define MNOTE_H4 493.88
#define MNOTE_C5 523.25
#define LENGTH 500

int x;

static gboolean
pipeline_stop (GstElement* pipeline)
{
gst_element_set_state (pipeline, GST_STATE_PAUSED);
g_object_unref (pipeline);

return FALSE;
}

static void 
play_sound (gdouble frequency)
{
GstElement *source, *sink;
GstElement *pipeline;

pipeline = gst_pipeline_new ("note");
source   = gst_element_factory_make ("audiotestsrc",
                                     "source");
sink     = gst_element_factory_make ("autoaudiosink",
                                     "output");

/* set frequency */
g_object_set (source, "freq", frequency, NULL);

gst_bin_add_many (GST_BIN (pipeline), source, sink, NULL);
gst_element_link (source, sink);

gst_element_set_state (pipeline, GST_STATE_PLAYING);

/* stop it after 500ms */
g_timeout_add (LENGTH, (GSourceFunc) pipeline_stop, pipeline);
}

main (int argc, char *argv[])
{
       gst_init (&argc, &argv);
       play_sound (MNOTE_E4);
}

Jak cos nie bedziesz dzialac to utwórz nowa prosta aplikacje gtk.

Odnośnik do komentarza
Udostępnij na innych stronach

Kod po malych poprawkach (case switch) wyglada nastepujaco

#include <unistd.h>
#include <stdio.h>
#include <gst/gst.h>

#define MNOTE_C4 261.63
#define MNOTE_D4 293.66
#define MNOTE_E4 329.63
#define MNOTE_F4 349.23
#define MNOTE_G4 392.00
#define MNOTE_A4 440.00
#define MNOTE_H4 493.88
#define MNOTE_C5 523.25
#define LENGTH 500

int x;

static gboolean
pipeline_stop (GstElement* pipeline)
{
       gst_element_set_state (pipeline, GST_STATE_PAUSED);
       g_object_unref (pipeline);

       return FALSE;
}

static void 
play_sound (gdouble frequency)
{
       GstElement *source, *sink;
       GstElement *pipeline;

       pipeline = gst_pipeline_new ("note");
       source   = gst_element_factory_make ("audiotestsrc",
                                            "source");
       sink     = gst_element_factory_make ("autoaudiosink",
                                            "output");

       /* set frequency */
       g_object_set (source, "freq", frequency, NULL);

       gst_bin_add_many (GST_BIN (pipeline), source, sink, NULL);
       gst_element_link (source, sink);

       gst_element_set_state (pipeline, GST_STATE_PLAYING);

       /* stop it after 500ms */
       g_timeout_add (LENGTH, (GSourceFunc) pipeline_stop, pipeline);
}


int main (int argc, char *argv[])
{
gst_init (&argc, &argv);

printf("Wybierz opcje \n");
printf("1. DMW DS (17,5 min) 2. DMW D/D (30 min) 3. Exit \n");
scanf("%d", x);
switch(x)
{
	case 1 : sleep(1050); play_sound (MNOTE_E4); play_sound (MNOTE_E4); play_sound (MNOTE_E4); break;
	case 2 : sleep(1800); play_sound (MNOTE_E4); play_sound (MNOTE_E4); play_sound (MNOTE_E4); break;
	case 3 : sleep(10); play_sound (MNOTE_E4); play_sound (MNOTE_E4); play_sound (MNOTE_E4); break;
	default : printf("Zla opcja"); break;
}
return 0;
}

 

Kod juz sie kompiluje i buduje (dzieki thof)

Uruchamiam, no dostaje owszem liste opcji, wybieram 1, zatwierdzam i "Naruszenie Ochrony Pamieci"

Nie bardzo wiem czy to moze wina scanf zle poskladanego, bowiem czepia sie go troche:

/home/Subaru/dmw-alarm/src/main.c:55:1: warning: return type defaults to ‘int’ [-Wreturn-type]
/home/Subaru/dmw-alarm/src/main.c:61:2: warning: format ‘%d’ expects argument of type ‘int *’, but argument 2 has type ‘int’ [-Wformat]

 

Raczej nie brakuje mu biblioteki, bo by sie czepil o to wyraznie

Dlaczego czepia sie nagle int main to dla mnie niespodzianka troche

 

EDIT #1 Dobra, sprawa main skorygowana na:

int main (int argc, char *argv[])

Odnośnik do komentarza
Udostępnij na innych stronach

  • 3 weeks later...

Przepraszam, ze tak pózno z odpowiedzia przybywam.

 

Faktycznie gafe zrobilem z tym scanf, przyzwyczajenie do DS'a tam w troche innej instrukcji wypisania podaje co prawda %d dla liczb calkowitych, ale po przecinku daje normalnie zmienna bez wskaznika, to mnie zmylilo

Strone znam, co niestety dobija moja gafe ze zdwojona sila T_T.

 

Skompilowalem i juz nie wywala gadki o naruszeniu ochrony pamieci, dziekuje bardzo thof :)

Jeszcze tylko zastanawiam sie czemu nie ma dzwieku. Myslalem, ze moze zle podpialem kabel mini-jack (ciagle go gdzies musze przepinac sobie), ale wlaczylem na VLC muzyke pierwsza z brzegu i dzwiek jest. Wedle kodu powinno 3 razy "piknac" nutke E4 a nie slysze tego. Podglosnilem nawet kolumienki na maksimum sadzac, iz moze po prostu tak cicho gra to, ale nadal cisza.

Youtube, Wine, VLC nie sa uruchomione (VLC zamknalem po sprawdzeniu), totez nie widze co by jeszcze moglo jakos blokowac dzwiek.

 

EDIT #1

Aaa momencik jest cos poprawy

dodalem play_sound (MNOTE_E4); pod gst_init (&argc, &argv); i juz zagralo dlugi staly dzwiek (zapewne E4 rzeczone).

Zapewne w kodzie w takim razie mam jakis blad, ze nie wygrywa tego jak nalezy.

 

EDIT #2

Malo tego, ten dzwiek gra tak dlugo, az natrafi na kolejny play_sound (MNOTE_E4); np. po odliczeniu dziesieciu sekund z opcji #3 o_o.

Moze nalozone 3 play_sound (MNOTE_E4); jeden za drugim sie jakos udusily albo zniwelowaly?

Odnośnik do komentarza
Udostępnij na innych stronach

Jeśli chcesz dodać odpowiedź, zaloguj się lub zarejestruj nowe konto

Jedynie zarejestrowani użytkownicy mogą komentować zawartość tej strony.

Zarejestruj nowe konto

Załóż nowe konto. To bardzo proste!

Zarejestruj się

Zaloguj się

Posiadasz już konto? Zaloguj się poniżej.

Zaloguj się
×
×
  • Dodaj nową pozycję...