Prośba o pilną pomoc - program wczytujący audio.

0

Witam. Chciałbym serdecznie poprosić doświadczonych programistów o rady w kwestii mojej pracy inżynierskiej, której termin oddania mam w maju a nie poczyniłem jeszcze żadnych konkretnych kroków. Ale od początku... nie należę do najpilniejszych uczniów i programowaniem prawie się nie interesuję - zdarzyło mi się popełnić kilka programów na zaliczenia lub w prezencie dla dziewczyny ale nigdy w tym nie siedziałem. Bardziej działam w web developingu. Mój aktualny temat pracy wynika z zupełnego przypadku a raczej z powodu tego, że był ostatni termin podania go a ja nic nie miałem i wymyśliłem sobie właśnie ten.... chodzi o stworzenie aplikacji windowsowskiej, która wczyta z pliku lub nagra z ustawionego w windowsie źródła sygnał audio a następnie wewnątrz aplikacji będzie możliwość odpowiednimi suwakami ustawić przestrzenne wrażenie umiejscowienia dźwięku (czyli jak blisko i z której strony) a to dzięki regulacji natężenia i przesunięcia względem siebie kanałów (lewy, prawy). W planach była jeszcze graficzna reprezentacja tego gdzie będzie znajdowało się źródło dźwięku po konkretnych ustawieniach i możliwość odtworzenia/zapisu zmienionego pliku. Wymyślając ten temat inspirowałem się wirtualnym fryzjerem - - może ktoś kojarzy i wydawało mi się, że nie będzie to specjalnie trudny program. Natomiast dla mnie każdy jest trudny stąd zwracam się o pomoc.

Tak więc:

1. Czy wybrałem odpowiednie środowisko i język (C++Builder) biorąc pod uwagę stopień trudności wykonania takiej aplikacji (nie obszerność, wydajność i szybkość działania)? Jedynie z C miałem dobre wspomnienia w trakcie studiów dlatego naturalnie w nim chciałem operować. Jeśli nie to prosiłbym o sugestie z czego najlepiej skorzystać.

2. Na jaki format postawić przy wczytywaniu audio z pliku (skompresowany mp3 czy może jakiś inny?). To samo jeśli chodzi o nagrywanie dźwięku czy najlepiej aby był to PCM.

3. Czy do takiej operacji jest jakaś biblioteka tudzież skrypt, który mógłbym wykorzystać? I tak samo do odtwarzania później tego wewnątrz programu tudzież manipulowania głośnością kanałów i przesunięciem - czy jest coś czego mógłbym użyć?

  1. à propos wizualizacji - grafika NIE będzie uwzględniała tego skąd dochodzi sygnał na wczytanym materiale zakładając z góry, że będzie to w pliku wyjściowym głośno i równocześnie z obu kanałów czyli tak jakby dźwięk dobiegał prosto koło naszej głowy. Tak więc wizualizacja może opierać się tylko na odpowiednim ustawieniu zależności suwaków. Chciałbym przyjąć widok z góry jako, że cały program nie będzie uwzględniał modulacji góra/dół (chyba:P) i tylko w 2d na środku głowa a na około punkt w którym ustawiamy źródło dźwięku. Pytanie jak to zrobić?

Będę bardzo wdzięczny za każdą pomoc gdyż grunt już powoli mi się pali mam około miesiąc na zrobienie tego i bez Was chyba nie dam rady. Pozdrawiam i z góry dziekuję za pomoc.

EDIT: Jeśli przeliczyłem się z tym programem i uważacie, że nie dam rady tego zrobić w tak krótkim czasie i ktoś czułby się na siłach mi w tym pomóc możliwe, że poszedłbym na uczciwy układ w takim wypadku proszę pisać na priv.

0

Może popatrz na źródła SFML audio.

0

Termin oddania pracy masz w maju, ale z tego co się orientuję, to po zakończeniu studiów masz 2 lata na złożenie pracy i obronę po napisaniu odpowiedniego podania :D Więc spokojnie się wyrobisz.

Którą wersję C++ Buildera masz na myśli? Bo jak <=6.0 to trochę nie na czasie :D

Tutaj masz mniej więcej aplikację, którą planujesz stworzyć: http://www2.hs-esslingen.de/~pherit00/website/surround.htm

0

tak 2 lata ale ja już 2 rok powtarzam:P Dopiero udało się przedmioty pozaliczać i w maju jednak chciałbym to złożyć... ta aplikacja co podałeś to jest w dosie - może mi się to przydać? C++ builder obojętnie może być i XE2. Jak by ktoś tak miły był odpowiedzieć punkt po punkcie. Pozdrawiam

3

Czy dla web developera wszystko co nie ma GUI, musi być przeznaczone dla systemu DOS? Jaki Ty kierunek studiujesz? Każdy nawet 64-bitowy program może być przeznaczony do użycia w terminalu. Nie uważasz, że jest lepiej gdy przykład użycia biblioteki nie jest dodatkowo komplikowany programowaniem GUI? Linuksa też Wam nie pokazywali na tych studiach?

To co podałem to przykład wykorzystania biblioteki OpenAL do rozwiązania podobnego zadania jak Twoje...

0

Polecam zapoznać się z biblioteką FMOD. Obecnie w niej siedzę i tworzę w niej część audio do mojej gry. W zasadzie moja praca opiera się na tym samym co ty próbujesz stworzyć. Pooglądaj sobie tutoriale o kofigurowaniu biblioteki. Dodam że jej obsługa w 100% wspiera wirtualizację otoczenia, czyli to o co ci chodzi. Jeśli masz jakieś pytania, komentuj

0

Witam. Wziąłem się w końcu za tą aplikację i po wielu podejściach zdecydowałem się na robienie w C++ Builder XE4 oraz na wykorzystanie wtyczki irrKlang - tutaj link do dokumentacji API - http://www.ambiera.com/irrklang/docu/index.html . Wybrałem ją ponieważ daje całkiem przyzwoite 3D no i ma w paczce przykłady użycia wtyczki ale niestety wszystko w wersji konsolowej:/ Zostało mi 5 dni do oddania pracy dlatego BARDZO PROSZĘ o szybką pomoc.

Utworzyłem nowy projekt w builderze i wybrałem windows 32 Form Apliccation. Program utworzył mi główny plik .cpp oraz plik .cpp z okienkiem, który jest inicjowany w głownym pliku, który wygląda tak:

#include <vcl.h>
#pragma hdrstop
#include <tchar.h>
#include <iostream>
#include <irrKlang.h>
//---------------------------------------------------------------------------
USEFORM("inzynierka.cpp", Form1);
//---------------------------------------------------------------------------
using namespace irrklang;
#pragma comment(lib, "irrKlang.lib")

int WINAPI _tWinMain(HINSTANCE, HINSTANCE, LPTSTR, int)
{
	try
	{
		Application->Initialize();
		Application->MainFormOnTaskBar = true;
		Application->CreateForm(__classid(TForm1), &Form1);
		Application->Run();
		 
	}
	catch (Exception &exception)
	{
		Application->ShowException(&exception);
	}
	catch (...)
	{
		try
		{
			throw Exception("");
		}
		catch (Exception &exception)
		{
			Application->ShowException(&exception);
		}
	}
	return 0;
}
//---------------------------------------------- 

Jak widać zaimplementowałem bibliotekę oraz dodałem te linijki

 using namespace irrklang;
#pragma comment(lib, "irrKlang.lib")

tak jak jest w przykładach natomiast nie potrafię dalej z tym ruszyć tzn. jak próbuję jakikolwiek kod z przykładu tutaj zastosować to wywalają błędy chociaż domyślam się, że to problem z tym, że ja robię okienko a przykłady są w konsoli.... mimo to nie potrafię tego rozgryźć jak by mi ktoś pokazał jak zaimplementować do okienka chociaż najprostszy z tych przykładów to dalej sobie sam poradzę. Na przykład jak sobię zrobię zwykły button to jak napisać funkcje, która otworzy mi plik z dysku za pomocą tej wtyczki i żeby potem innym przyciskiem taki dźwięk odwtorzyć? i w którym pliku tą funkcję napisać? Dodać nowy czy w tym głównym z projektu? bo najłatwiej by chyba było gotowe funkcje mieć a potem pod akcją przycisku tylko ją wywoływać? Wiem, że nic nie wiem w tym temacie ale wierzę, że jak mi ktoś wskaże drogę to ruszę... Z góry dzięki za odpowiedzi

3

Że tak spytam... jaja sobie robisz?

Bierzesz się, za pracę inżynierską dopiero 5 dni przed oddaniem? Przecież aż sam się prosisz, by Cię wywalili. Tacy ludzie nie zasługują na dyplom. Nie wiem jak u Was na uczelni, ale podejrzewam, że oprócz napisania aplikacji, musisz jeszcze napisać dłuuugi dokument tekstowy. Na siłę nikt z Ciebie inżyniera nie zrobi, a jak pójdziesz potem do pracy na stanowisko programisty, to nie ośmieszaj uczelni i siebie. Myślałeś, że jak po tak długim czasie oczekiwania napiszesz nam "macie 5 dni", to od razu pod presją czasu szybciej opracujemy dla Ciebie rozwiązanie? To tak nie działa...

BTW. programy okienkowe też potrafią produkować wyjście na konsoli i to, że przykłady są "konsolowe" nie ma nic do rzeczy. Wklej błędy, które Ci wyskakują...

0

Witam. To co robię dzisiaj to są efekty moich błędów z przeszłości - nie jestem programistą i nie będę pracował w tym zawodzie natomiast, że tak powiem wkopałem się w ten temat pracy i nie posiadam umiejętności żeby to zrobić. Mogłem wziąć temat z jakimś htmlem 5 to bym prace już oddał dawno ale jest za późno na zmianę tematu i na cokolwiek. Przez ostatnie 2 tygodnie byłem w niemczech gdyż miałem nagłą dobrą opcję zarobienia trochę pieniędzy a jak to bywa w naszym kraju głupio przepuścić szanse na pieniądze. Co do terminu oddania wiem, że się nie wyrobię teraz na 10tego ale sesji jeszcze nie ma a uczelnia pracować na razie będzie więc z doświadczenia moich znajomych twierdzę, że nic się nie stanie jak się trochę spóźnię. Ciągnie się za mną ta inżynierka już od kilku lat i po prostu chce to mieć w końcu z głowy bo już dość czasu i pieniędzy na te studia wydałem. Nie jestem z tych którzy chcą za darmo dyplom i będą się chwalić tytułem bo jak by tak było to bym nie szedł na politechnikę tylko do jakiejś prywatnej szkoły. To tyle w kwestii moich motywacji.

Tak jak napisałem przecież - nie chcę żeby mi za mnie ludzie wszystko zrobili "bo to ostatnia chwila" tylko chciałbym żeby mi ktoś przykład pokazał bazując na którym już sobie potem dalej poradzę. Np. jeśli mam taki kod jak zamieszczę niżej, który tworzy za pomocą biblioteki urządzenie wirtualne i nagrywa dźwięk, który potem zapisuje na dysk to jak to przerobić tak żebym miał te opcje nie pod przyciskami klawiatury tylko po naciśnięciu przycisku w okienku. Choćby jedną funkcjonalność z tego jak by mi ktoś pokazał byłym wdzięczny bardzo:

using namespace irrklang;

void writeWaveFile(const char* filename, SAudioStreamFormat format, void* data);

// The following will simply start up the irrklang engine, create an audio recorder, record
// some audio when the user presses a key, and save that data to a wave file. Additionally,
// the data is added into the sound engine and played back as well.
int main(int argc, const char** argv)
{
	ISoundEngine* engine = createIrrKlangDevice();
	IAudioRecorder* recorder = createIrrKlangAudioRecorder(engine);

	if (!engine || !recorder)
	{
		printf("Could not create audio engine or audio recoder\n");
		return 1;
	}

	printf("\nPress any key to start recording audio...\n");
	getch();

	// record some audio

	recorder->startRecordingBufferedAudio();

	printf("\nRECORDING. Press any key to stop...\n");
	getch();

	recorder->stopRecordingAudio();

	printf("\nRecording done, recorded %dms of audio.\n", 
		recorder->getAudioFormat().FrameCount * 1000 / recorder->getAudioFormat().SampleRate );
	printf("Press any key to play back recorded audio...\n");
	getch();
	
	// write the recorded audio as wave file
	writeWaveFile("recorded.wav", recorder->getAudioFormat(), recorder->getRecordedAudioData());

	// play the recorded audio
	recorder->addSoundSourceFromRecordedAudio("myRecordedVoice");
	engine->play2D("myRecordedVoice", true);

	// wait until user presses a key
	printf("\nPress any key to quit...");
	getch();

	recorder->drop();
	engine->drop(); // delete engine

	return 0;
}


// writes the recorded audio data into a .WAV file
void writeWaveFile(const char* filename, SAudioStreamFormat format, void* data)
{	
	if (!data)
	{
		printf("Could not save recorded data to %s, nothing recorded\n", filename);
		return;
	}

	FILE* file = fopen(filename, "wb");

	if (file)
	{
		// write wave header 
		unsigned short formatType =	1;
		unsigned short numChannels = format.ChannelCount;
		unsigned long  sampleRate =	format.SampleRate;
		unsigned short bitsPerChannel = format.getSampleSize() * 8;
		unsigned short bytesPerSample = format.getFrameSize() ;
		unsigned long  bytesPerSecond = format.getBytesPerSecond();
		unsigned long  dataLen = format.getSampleDataSize();
			
		const int fmtChunkLen = 16;
		const int waveHeaderLen = 4 + 8 + fmtChunkLen + 8;

		unsigned long totalLen = waveHeaderLen + dataLen;

		fwrite("RIFF", 4, 1, file);
		fwrite(&totalLen, 4, 1, file);
		fwrite("WAVE", 4, 1, file);
		fwrite("fmt ", 4, 1, file);
		fwrite(&fmtChunkLen, 4, 1, file);
		fwrite(&formatType, 2, 1, file);
		fwrite(&numChannels, 2, 1, file);
		fwrite(&sampleRate, 4, 1, file);
		fwrite(&bytesPerSecond, 4, 1, file);
		fwrite(&bytesPerSample, 2, 1, file);
		fwrite(&bitsPerChannel, 2, 1, file);

		// write data

		fwrite("data", 4, 1, file);
		fwrite(&dataLen, 4, 1, file);
		fwrite(data, dataLen, 1, file);

		// finish

		printf("Saved audio as %s\n", filename);
		fclose(file);
	}
	else
		printf("Could not open %s to write audio data\n", filename);
} 

Ja rozumiem ten kod ale nie znam funkcji dla okienek bo domyślam się, że printf() nie wypisze mi rzeczy w fieldzie. Proszę o jeden przykład tylko. Pozdrawiam

EDIT: A jeśli chodzi o błędy to już tych błędów nie mam bo to było dlatego, że .lib nie był przerobiony z coff na omf. Niewiem co to jest ale ważne, że pomogło:P

0
garecki napisał(a):

Ja rozumiem ten kod ale nie znam funkcji dla okienek bo domyślam się, że printf() nie wypisze mi rzeczy w fieldzie. Proszę o jeden przykład tylko.

Z palca pisane/składane:

string komunikat;
sprintf(komunikat,"Could not save recorded data to %s, nothing recorded\n", filename);
this->Edit1->Text = komunikat;
5

5 DNI do oddania programu i dokumentacji, a kolega kontrolkami BCB nie potrafi się posługiwać, nie mówiąc o programowaniu w C++, hahaha!!! (przepraszam, musiałem)

1 użytkowników online, w tym zalogowanych: 0, gości: 1