Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

winAPI obrada zvuka u realnom vremenu, gde gresim?

[es] :: C/C++ programiranje :: winAPI obrada zvuka u realnom vremenu, gde gresim?

[ Pregleda: 2918 | Odgovora: 12 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

MilosDj
Milos Djuric
Belgrade

Član broj: 14174
Poruke: 307
79.101.90.*



+4 Profil

icon winAPI obrada zvuka u realnom vremenu, gde gresim?09.12.2008. u 04:35 - pre 187 meseci
Trenutno pravim mali programcic u VC++2008ex. Koristim cist winAPI.

Sa waveInAddBuffer dam buffer zvucnoj kartici, ona tu usnimi malo zvuka, i kad je buffer put, posalje mi WIM_DATA poruku da je buffer pun i da mogu da ga obradim.
Da kazemo da program koliko toliko radi.

Ideja je da dobijem 20ms audio snimka, dam buffer2 zvucnoj da ga puni. Za to vreme jednostavno obradim buffer1, cekam i kad se buffer2 napuni, dam zvucnoj buffer1 a obradjujem buffer2.
Makar je takva bila zamisao.
Lose je sto mi trebaju snimci u intervalima manjim od 20ms. A najbolji timing izmedju dve WIM_DATA poruke (buffer full) mi je oko 47ms.


Gde gresim? Da li audio kartica uopste moze da "transferuje" toliku kolicinu iseckanih podataka za manje od 20ms ili ne? Da li se to moze ubrzati?
Brzina pristizanja WIM_DATA poruka izgleda da ne zavisi od sample rate Hz :(
Znaci, kako da dobijem brzinu od makar 50 WIM_DATA poruka u sekundi?


p.s. kako da podesim VC++2008ex da pravi .exe koji radi na visti i na xp? za sada mi prg radi samo na visti.

I'm not in this world to live up to your expectations and you're not in this world to live up to mine.
 
Odgovor na temu

nikomak
Nikola Makić
Beograd

Član broj: 177053
Poruke: 65
*.rcub.bg.ac.yu.



+1 Profil

icon Re: winAPI obrada zvuka u realnom vremenu, gde gresim?09.12.2008. u 18:08 - pre 187 meseci
Za prvi deo ne znam kako da odgovorim, posto nikad nisam koristio "cist" winapi, odnosno mmsystem za handle-ovanje zvuka.
Mozda da probas DirectShow, koji je i sam od "skoro" deo Windows SDK, a ne vise DirectX SDK.

Sto se tice definisanja verzije exe-a koja ce raditi i na xp-u i na visti

Code:

#ifndef WINVER                          
#define WINVER 0x0501           
#endif

#ifndef _WIN32_WINNT            
#define _WIN32_WINNT 0x0501     
#endif

TurboDispatchJumpAddressEnd
----
Knocka Fia
----
And so we meet, again in a different time
 
Odgovor na temu

pcaca
Aleksandar
Makedonija

Član broj: 5333
Poruke: 92
77.29.17.*



Profil

icon Re: winAPI obrada zvuka u realnom vremenu, gde gresim?09.12.2008. u 21:21 - pre 187 meseci
Nikad nisam programirao aplikacije koje rade sa zvukom. Ali sam koristio neke profesionalne aplikacije za obradu zvuka i znam da svi oni koriste ASIO http://en.wikipedia.org/wiki/Audio_Stream_Input/Output kako bi smanjili latenciju.

Mozda da pogledas Juce C++ framework http://www.rawmaterialsoftware.com/juce/ koji nudi mogucnost rada sa ASIO i DirectSound za windows paltformu. Neznam dal se moze posebno koristiti samo Audio deo framework-a, bez zavisnosti na ostale delove.
 
Odgovor na temu

NastyBoy
Bojan Nastic
UK

Član broj: 12041
Poruke: 895
*.zone5.bethere.co.uk.



+4 Profil

icon Re: winAPI obrada zvuka u realnom vremenu, gde gresim?09.12.2008. u 22:24 - pre 187 meseci
Koliko se secam manji latency necesh dobiti obichnim WinAPI pozivima. Za to ti treba mnogo nizi pristup, pogledaj DirectX/DirectSound za pocetak
 
Odgovor na temu

MilosDj
Milos Djuric
Belgrade

Član broj: 14174
Poruke: 307
79.101.164.*



+4 Profil

icon Re: winAPI obrada zvuka u realnom vremenu, gde gresim?09.12.2008. u 23:25 - pre 187 meseci
Probao #ifndef ali error je i dalje isti :(
this application has failed to start because the application configuration is incorect
Googlao sam i jasniji mi je proglem, ali ne i resenje.

Nije mi jasno zasto je toliko veliko kasnjenje za WIM_DATA poruku. Ali ako kazete da ne moze brze, mirim se sa sudbinom.

Pre nego sto pocnem da ucim DxSound jos jedno pitanje.

Da li mogu direktno da pristupam waveHeader.lpdata audio bufferu?
Pade mi na pamet da koristim:
DWORD dwBytesRecorded; // how much data is in lpData

I tako odredim dokle je snimanje stiglo, a da sve to proveravam opet nekom WM_TIME na svakih 5 ili 10 ms...

WinAPI mi je donekle i poznat, Dx veze nemam, pa mi se ne uci jos jedna nova stvar tek tako.
I'm not in this world to live up to your expectations and you're not in this world to live up to mine.
 
Odgovor na temu

MilosDj
Milos Djuric
Belgrade

Član broj: 14174
Poruke: 307
79.101.229.*



+4 Profil

icon Re: winAPI obrada zvuka u realnom vremenu, gde gresim?11.12.2008. u 23:31 - pre 187 meseci
Da odgovorim na prvi deo mog pitanja:

VC++ 2008 Express nema opciju pravljenja "Setup and Deployment Project.
Sto znaci da mora da se koristi XCopy metod:

Sa http://www.microsoft.com/downl...74b9f2bc1bf&displaylang=en se skine vcredist_x86.exe i on instalira potrebne dll-ove na comp.
I onda moje programce moze da radi na tudjem compu :)

Sto se tice drugog dela:

Audio bufferu waveHeader.lpdata se moze direktno pristupati.
Ostaje mi da premerim brzinu waveInAddBuffer(hwi, waveHeader, sizeof(WAVEHDR)); i ako je to zadovoljavajuce da naucim da koristim CreateTimerQueueTimer();

Ovaj projekat ce mozda i videti svetlo dana ;)
I'm not in this world to live up to your expectations and you're not in this world to live up to mine.
 
Odgovor na temu

MilosDj
Milos Djuric
Belgrade

Član broj: 14174
Poruke: 307
93.86.50.*



+4 Profil

icon Re: winAPI obrada zvuka u realnom vremenu, gde gresim?12.12.2008. u 08:41 - pre 187 meseci
Nisam se bas proslavio sa CreateTimerQueueTimer();
Kad je app u fokusu i kad nista ne pipam sa compom onda radi i poziva se na svakih 5ms.
Kako izgubi fokus, tako joj raste vreme odziva :(

1. Da li mogu samo toj funkciji da povecam prioritet prilikom izvrsavanja i kako? Malo mi glupo da pravim ceo nov thread posto se njena callback funkcija vec izvrsava kao zaseban thread.

2. Ima li smisla praviti PeekMessage pa tu racunati sto vise od pristiglih informacija?
Kako da sinhronizujem peekmessage racun sa racunom iz CreateTimerQueueTimer();...?


Tja, kad joj zadam high priority app lepo radi vec 15 minuta. Ja citam mail, pisem ovde... Radi.
Jedino joj smeta kad koristim usbTV.
I'm not in this world to live up to your expectations and you're not in this world to live up to mine.
 
Odgovor na temu

deerbeer
Beograd

Član broj: 174418
Poruke: 1189
*.ptt.yu.



+395 Profil

icon Re: winAPI obrada zvuka u realnom vremenu, gde gresim?12.12.2008. u 10:16 - pre 187 meseci
Citat:
MilosDj: Nisam se bas proslavio sa CreateTimerQueueTimer();
Kad je app u fokusu i kad nista ne pipam sa compom onda radi i poziva se na svakih 5ms.
Kako izgubi fokus, tako joj raste vreme odziva :(

http://msdn.microsoft.com/en-us/library/ms713416(VS.85).aspx
Pogledaj i TIMECAPS strukturu za timer rezoluciju .

poruke koje salje timer nekad dodju ranije ili kasnije
u zavisnosti od ostalih win poruka koje dobijas i koje se obradjuju sa message queue-a.
Koristi bolje DShow http://msdn.microsoft.com/en-us/library/ms787550(VS.85).aspx

Citat:

VC++ 2008 Express nema opciju pravljenja "Setup and Deployment Project.
Sto znaci da mora da se koristi XCopy metod:

http://www.innosetup.com/isinfo.php

Citat:

Sa http://www.microsoft.com/downl...74b9f2bc1bf&displaylang=en se skine vcredist_x86.exe i on instalira potrebne dll-ove na comp.
I onda moje programce moze da radi na tudjem compu :)

Staticki linkuj CRT i MFC i ne treba ti vcredist.


Viva lollapalooza
 
Odgovor na temu

MilosDj
Milos Djuric
Belgrade

Član broj: 14174
Poruke: 307
212.200.218.*



+4 Profil

icon Re: winAPI obrada zvuka u realnom vremenu, gde gresim?12.12.2008. u 22:34 - pre 187 meseci
Prvo, hvala za inosetup. Jako lepa stvar!
Drugo, kako se staticki linkuje CRT? Ovo mi je 10 dan u VC+ i nije mi tako jednostavno da nadjem osnovne stvari.

Trece, ta CreateTimerQueueTimer finkcija bi i trebala da bude brza jer ne koristi standardnu WM_TIME poruku. I ideja je bila da samo njoj dam high ili real time priority.
Samo jos ne znam kako :-\
Jedino sto ta funkcija ne radi extra stabilno :(


TIMECAPS je prva stvar koju sam uradio. Lepo ispise karakteristike hardvera i gasi prg ako timeGetTime ne moze da postigne 1ms. Evo i koda ako nekog zanima:
Citat:
if (timeGetDevCaps(&tc, sizeof(TIMECAPS)) != TIMERR_NOERROR)
{MessageBox(hWnd,L"Can not reach timing hardver!\n\nTerminating program.",L"TIMERR_NOCANDO",MB_OK); PostQuitMessage(WM_QUIT); return 0;}

wTimerRes = min(max(tc.wPeriodMin, TIMING_RESOLUTION), tc.wPeriodMax); //timing res 1 ms
//sets timer min resolution:
if(timeBeginPeriod(wTimerRes) != TIMERR_NOERROR)
{MessageBox(hWnd,L"Can not set timing hardver!\n\nTerminating program.",L"TIMERR_NOCANDO",MB_OK); PostQuitMessage(WM_QUIT); return 0;}
if(wTimerRes==1)
{MessageBox(hWnd,L"Timer is 1ms precise",L"TIMERR",MB_OK);}

Nije mi bas najjasnije u MSDN objasnjenju da li treba stalno da pozivam:
timeBeginPeriod(1ms);
timeGetTime();
timeEndPeriod(1ms);

Ili mogu da jednom zadam timeBeginPeriod(1ms) i odjavim ga kad na WM_CLOSE sa timeEndPeriod(1ms) kao sto sam video u jednom primeru?

Ali sve ovo gore valjda znaci da mi je citanje realnog vremena precizno 1ms.


Gledam onaj Dshow i jako mi se dopada. Mozes li mi napisati neke osnovne funkcije tipa deklaracija tog timera, citanje vremenske vrednosti, ili ne do bog da postoji neka f koja se periodicno poziva a da je hardverski zakucana za clock :)

Ne treba mi kod, to mogu i sam. samo nabacaj imena nekih f da ne bih morao 3 dana da ih sam trazim.


p.s. ima li neki drugi, bolji nacin da nekako napravim jednu f() koja ce biti apsolutno stabilno pozivana na svakih 5ms?


I'm not in this world to live up to your expectations and you're not in this world to live up to mine.
 
Odgovor na temu

savkic
Igor Savkić

Član broj: 92186
Poruke: 2739



+92 Profil

icon Re: winAPI obrada zvuka u realnom vremenu, gde gresim?13.12.2008. u 00:49 - pre 187 meseci
Jednostavan način i solidno tačan je upotreba wait funkcija (WaitForSingleObject, WaitForMultipleObjects...) ili Sleep funkcije, takođe i obična petlja sa upotrebom GetTickCounta. Ne treba zaboraviti ni waitable timerer (CreateWaitableTimer, SetWaitableTimer). Za veće preciznosti možeš koristiti QueryPerformanceFrequency i QueryPerformanceCounter a najveću preciznost možeš dobiti (ali ne verujem da će ti trebati) pomoću procesorskog brojača ciklusa RDTSC.
 
Odgovor na temu

MilosDj
Milos Djuric
Belgrade

Član broj: 14174
Poruke: 307
212.200.218.*



+4 Profil

icon Re: winAPI obrada zvuka u realnom vremenu, gde gresim?13.12.2008. u 08:45 - pre 187 meseci
QueryPerformanceCounter mi se dopada i upravo ga implementiram u program.
Citam da ume da zeza na multi CPU systemima.
A vidi ovo:
http://support.microsoft.com/d...spx?scid=KB;EN-US;Q274323&


Ovo nije lose za procitati:
http://blogs.msdn.com/oldnewthing/archive/2005/09/02/459952.aspx

I posebno izdvajam mali prg koji meri vreme poziva raznih time funkcija:
http://developer.nvidia.com/ob...imer_function_performance.html

Onaj rdtsc me odusevio ali mi nije jasno kako ga covek moze upotrebiti ako mi na laptopu stalno varira CPU brzina. Od 800MHz do 1.8Ghz. Citam da ljudi predlazu da iskljucim SpeedStep i tako merim???!


I meni trenutno najznacajnije od svih pitanja:

Kako se pravi ta petlja sa GetTickCount ili timeGetTime()?

Moje razumevanje WinAPI ide dotle da WndProc obradjuje pristizuce WM_ poruke, jednu po jednu.
Zato se to i zove message queue.

E sad, kako da napravim mrtvu petlju koja ce da radi u realnom vremenu i da bude nezavisna od WM_ poruke koja ce je startovati?






Nasao sam i ovo, mozda zatreba nekome:
Citat:
GetSystemTime() - Windows system time

Granularity: 100 nanoseconds
Precision: approximately 10 milliseconds
(Approximately 55ms on Windows 95/98/ME, 15ms on Windows NT

3.1.)
(Presently reported as 10.0144 milliseconds.)
Apparent precision: 2.4956616925708e-006 seconds
Apparent jitter: 2.99319765900016e-007 seconds


GetSystemTimeAsFileTime() - Windows system

time in file time

Granularity: 100 nanoseconds
Precision: Same as system time 10-55ms
Apparent precision: 2.40253998762413e-006 seconds
Apparent jitter: 1.59637208480008e-007 seconds

GetTickCount()

Granularity: 1 millisecond
Precision: Same as system time 10-55ms
Apparent precision: 2.4956616925708e-006 seconds
Apparent jitter: 2.39455812720012e-007 seconds

timeGetTime() - Windows Multimedia Timer


Granularity: 1 millisecond
Precision: 1 millisecond
Apparent precision: 2.32804262366679e-006 seconds
Apparent jitter: 1.19727906360006e-007 seconds


Accuracy : A clock's ability to maintain true time
Granularity: The smallest unit of time a clock is able to

represent
Precision: The smallest difference in time successive

readings can measure
Jitter: The variation in timing samples

I'm not in this world to live up to your expectations and you're not in this world to live up to mine.
 
Odgovor na temu

savkic
Igor Savkić

Član broj: 92186
Poruke: 2739



+92 Profil

icon Re: winAPI obrada zvuka u realnom vremenu, gde gresim?13.12.2008. u 12:31 - pre 187 meseci
> Onaj rdtsc me odusevio ali mi nije jasno kako ga covek moze upotrebiti ako mi na laptopu stalno varira CPU brzina. Od 800MHz do 1.8Ghz.
> Citam da ljudi predlazu da iskljucim SpeedStep i tako merim???!

Da, jedino tako.

> I meni trenutno najznacajnije od svih pitanja:
> Kako se pravi ta petlja sa GetTickCount ili timeGetTime()?

Code:

Primer iz MSDNa.

DWORD dwStart = GetTickCount();

// Stop if this has taken too long
if( GetTickCount() - dwStart >= TIMELIMIT )
    Cancel();


> Moje razumevanje WinAPI ide dotle da WndProc obradjuje pristizuce WM_ poruke, jednu po jednu.
> Zato se to i zove message queue.

Zavisi, poruke niskog intenziteta poput WM_TIMER i WM_PAINT se obrađuju na kraju.

> E sad, kako da napravim mrtvu petlju koja ce da radi u realnom vremenu i da bude nezavisna od WM_ poruke koja ce je startovati?

Ne možeš se oslanjati na poruku za startovanje merenja ako je potrebna preciznost. Najbolje da merenje vršiš u posebnom threadu, a idealno bi bilo i da audio obradu ubaciš u thread.




 
Odgovor na temu

deerbeer
Beograd

Član broj: 174418
Poruke: 1189
*.adsl-1.sezampro.yu.



+395 Profil

icon Re: winAPI obrada zvuka u realnom vremenu, gde gresim?14.12.2008. u 02:42 - pre 187 meseci
Citat:

E sad, kako da napravim mrtvu petlju koja ce da radi u realnom vremenu i da bude nezavisna od WM_ poruke koja ce je startovati?

Najbolje thread , mada je i to sistemski zavisno jer imaju svoje prioritete na koje nekad ne mozes direktno da utices ,
bez obizra na flagove koje postavljas sa SetThreadPriority() (THREAD_PRIORITY_HIGH ,NORMAL, itd...)
Petlja u zasebnom thread-u ce se vrteti brzo koliko cpu dozvoljava ...i sa GetTickCount mozes donekle meriti preciznost intervala ,
a sa PeekMessage proveravas samo odredjene win poruke tipa WM_CLOSE da bi uradio neki "clean up" u toku gasenja thread-a
da timer proc. treba da zna kad da se ugasi ...
Sve sto alociras ili iniciras u jednom threadu moras u istom i da obavis ciscenje,
takodje svaki poziv bilo koje f-je proveravaj na provratnu vrednost ili sa GetLastError() da ne bi doslo do "deadlocka" u timer proc.
Code:
 
unsigned int WINAPI TimerProc (void* lParam) 
{
   DWORD dwStart = GetTickCount() ; 

   while(true) 
   {
    
     if (PeekMessage(&msg,0,0,0,0))
      { 
          if msg.message == WM_CLOSE) 
           {    
             //clean up code
               break ;  
            }
      }
     DWORD dwCurent = GetTickCount() ;
     if(dwCurent - dwStart>= TIMELIMIT )
     {
        // time period .. 
     }
      else 
      {
         dwStart = dwCurent ; 
      }
    
  }
 return 0;
}

Poruke threadu jedino saljes sa PostThreadMessage() i ona je po prirodi asinhrona (za razliku od SendMessage())
sto ce reci poziv se odmah vraca u tvom user-thread kodu kao i povratna vrednost da li je poruka uspesno poslata :
jer u nekoj sinhronizaciji message queue nije kreiran za pokrenut thread (jer PeekMessage() ili GetMessage inicira kreiranje queue-a)
pa moze i da vrati FALSE . U tom slucaju :
Code:
 

while (!PostThreadMessage(ThreadID,WM_CLOSE,0,0))
{
    // ponavljaj slanje poruke dok thread ne skapira da je dobio .
}

Ni ovo cak nije najjbezbednija metoda jer nekad dodje do "deadlock-a" u threadu pa ce ova f-ja da
se izvrsava beskonacno i zakucace tvoj prog. ("your progam is not responding").
Zato pazljivo sa tredovima ako si bas resen da se igras sa win-apijem ;)








[Ovu poruku je menjao deerbeer dana 14.12.2008. u 03:52 GMT+1]
Viva lollapalooza
 
Odgovor na temu

[es] :: C/C++ programiranje :: winAPI obrada zvuka u realnom vremenu, gde gresim?

[ Pregleda: 2918 | Odgovora: 12 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.