Permalänk
Medlem

Läsa data via ljudkortet? C/C++

Halloj!

Jag skulle behöva lite hjälp med ljud/synkning programmering. Jag letade som en tok först på nätet efter C# exempelkod och hjälpsidor men nu har jag gått över till C/C++. Jag har letat på nätet och hittat massor med exempelprogram men jag har inte fattat riktigt hur det fungerar med "ljuddata" programmering.

Det är så här att jag vill läsa data från ljudingången(mic) på datorn. Sedan ska data behandlas och omvandlas till tidkoder. Det är 80 bitar i taget som ska läsas. Man användersig (om jag fattat rätt) "stömar" för att läsa av data, men som jag inte rigtigt har förstått hur det fungerar.

Någon som har lite förlag och tips på hur det fungerar?

Visa signatur

..hmmm.........få se nu......hmmmm.

Permalänk
Medlem

Re: Läsa data via ljudkortet? C/C++

Citat:

Ursprungligen inskrivet av hoena
Halloj!

Jag skulle behöva lite hjälp med ljud/synkning programmering. Jag letade som en tok först på nätet efter C# exempelkod och hjälpsidor men nu har jag gått över till C/C++. Jag har letat på nätet och hittat massor med exempelprogram men jag har inte fattat riktigt hur det fungerar med "ljuddata" programmering.

Det är så här att jag vill läsa data från ljudingången(mic) på datorn. Sedan ska data behandlas och omvandlas till tidkoder. Det är 80 bitar i taget som ska läsas. Man användersig (om jag fattat rätt) "stömar" för att läsa av data, men som jag inte rigtigt har förstått hur det fungerar.

Någon som har lite förlag och tips på hur det fungerar?

Är din Google trasig? Nåja, jag hjälper dig då...

http://www.google.se/search?hl=sv&q=Record+Sound+C%23&meta=
Där hittar du hur du gör med både C/C++ och win32, och hur man gör med DirectSound

Eller mera pedagogiskt

1. Ladda hem Managed Direct X
2. Kolla på "\Samples\Managed\DirectSound\CaptureSound"
3. Bli kompis med CaptureDevice-klassen

"stömar"? Strömmar, streams.. en ström är en sekvens bytes. Kolla på de enkla exemplen med textfiler i System.IO så fattar du.

Visa signatur

AMD 5000+ BE @ | HD3850 512MB | MSI K9A2 CF | 4 x 1GB PC6400 4-4-4-12 | Antec Sonata

Permalänk
Medlem

Re: Re: Läsa data via ljudkortet? C/C++

Citat:

Ursprungligen inskrivet av GibsonSG
Är din Google trasig? Nåja, jag hjälper dig då...

http://www.google.se/search?hl=sv&q=Record+Sound+C%23&meta=
Där hittar du hur du gör med både C/C++ och win32, och hur man gör med DirectSound

Eller mera pedagogiskt

1. Ladda hem Managed Direct X
2. Kolla på "\Samples\Managed\DirectSound\CaptureSound"
3. Bli kompis med CaptureDevice-klassen

"stömar"? Strömmar, streams.. en ström är en sekvens bytes. Kolla på de enkla exemplen med textfiler i System.IO så fattar du.

Nä min vän google är allt inte trasig, den glöder av värme. Jo jag har sökt på google och som jag sa har jag hittat massor med artiklar och titat på exempelkod. Får väl ta och titta några 100h till. tänkte om det är någon här som har förståelse för ljuddata så kanske man kunde få en hjälpande hand. Jag vill hälst inte anvnända mig av directX men kanske är det lättaste och enda sättet och så var det c/c++ som jag ska anävnda mig av nu och inte c#.

Visa signatur

..hmmm.........få se nu......hmmmm.

Permalänk
Medlem

Jag passar på att fråga i denna tråd, finns det några fina öppna bibliotek (GPL, BSD etc) som man kan spana in angående ovanstående fråga?

Permalänk
Medlem

Re: Re: Re: Läsa data via ljudkortet? C/C++

OK, du har alltså tittat ett par hundra timmar på google, och inte förstått hur du skall göra. Vad tror du någon här ska kunna hjälpa dig med då? Lägga handen på din panna och ge dig någon gudomlig insikt?

Om du inte klarar av att förstå något av de otaliga exempel som finns att ladda hem så är det inte hjälp med "ljudprogrammering" du behöver, utan du behöver lära dig mer om programmering i allmänhet, och kanske windows och .NET i synnerhet. Jag menar, herregud i DirectSound SDK finns ETT FÄRDIGT EXEMPEL på det du vill göra? Mer pedagogiskt än så blir det inte...

Du vet inte vad en ström är? Börja med att kolla upp det. Då klarnar nog en hel del.

Och för sjutton, använd C# istället för C++! Det finns en anledning till att MS utvecklade .NET, och jag lovar att det inte beror på att det är lätt att skriva robust och korrekt C++ kod.

Lycka till!

Visa signatur

AMD 5000+ BE @ | HD3850 512MB | MSI K9A2 CF | 4 x 1GB PC6400 4-4-4-12 | Antec Sonata

Permalänk
Medlem

Re: Re: Re: Re: Läsa data via ljudkortet? C/C++

Citat:

Ursprungligen inskrivet av GibsonSG
OK, du har alltså tittat ett par hundra timmar på google, och inte förstått hur du skall göra. Vad tror du någon här ska kunna hjälpa dig med då? Lägga handen på din panna och ge dig någon gudomlig insikt?

Om du inte klarar av att förstå något av de otaliga exempel som finns att ladda hem så är det inte hjälp med "ljudprogrammering" du behöver, utan du behöver lära dig mer om programmering i allmänhet, och kanske windows och .NET i synnerhet. Jag menar, herregud i DirectSound SDK finns ETT FÄRDIGT EXEMPEL på det du vill göra? Mer pedagogiskt än så blir det inte...

Du vet inte vad en ström är? Börja med att kolla upp det. Då klarnar nog en hel del.

Och för sjutton, använd C# istället för C++! Det finns en anledning till att MS utvecklade .NET, och jag lovar att det inte beror på att det är lätt att skriva robust och korrekt C++ kod.

Lycka till!

Nu ska vi inte vara elaka här ^^. Jag har goda grundkunskaper både innom C, C++ och C# och jag har inte sökt på google i 100h. Det jag menade är att jag har tittat på kodexempel i C# och försökt, försökt och försökt att förstå hur jag ska använda dem olika delarna föra att få tag på bitarna som jag vill använda och hur jag ska omvandla dem till tidkoden. Sen tillslut tröttnade jag på C# och efter en programmering C kurs så täntke jag att köra C/C++ istället men lyckades inte så bra efter att försökt och försökt. Därför frågade jag lite om hjälp. Jag menade inte att någon skulle rabbla upp hela bibeln för mig utan kanske lite tips på egna erfarenheter m.m. Jag vet vad "streams" är och jag höll på med det i C# men fick inte ihop det riktigt med "ljudstrems".

Jag ska ta och titta på directX och de färdiga exemplena du föreslog och se om jag blir något klokare.

Visa signatur

..hmmm.........få se nu......hmmmm.

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av crull
Jag passar på att fråga i denna tråd, finns det några fina öppna bibliotek (GPL, BSD etc) som man kan spana in angående ovanstående fråga?

PortAudio är ett fint BSD-licence lib för lowlevel audio. Jag kan rekommendera att ni båda kollar in det.

http://www.portaudio.com/

EDIT: var visst MIT-licens

Visa signatur

Teeworlds - För dig som gillar gulliga saker med stora vapen.

Permalänk

Titta lite på hur AudaCity hanterar ljudingångarna (http://audacity.sf.net)

En sak om C++ som Stroustrup skrev i sin bok: "You have been warned" kommer inte ihåg exakt var det står (och det gör tyvärr inte min föreläsare heller som påminnde mig om frasen förut i veckan) men det handlar om att program man skriver i C++ gör det man vill mer eller mindre till punkt och pricka och gör man något fel kan allt gå åt helvete, men om man har tungan rätt i mun så är C++ ett oerhört kraftfullt språk (det bygger ju på C så därför har det Cs stora brist att allt kan gå åt helvete om man gör en pytteliten miss, typ en bokstav fel bara)

Visa signatur

RTFM - vacker sak att säga till folk som ställer dumma frågor

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av jcarlsson
Titta lite på hur AudaCity hanterar ljudingångarna (http://audacity.sf.net)

En sak om C++ som Stroustrup skrev i sin bok: "You have been warned" kommer inte ihåg exakt var det står (och det gör tyvärr inte min föreläsare heller som påminnde mig om frasen förut i veckan) men det handlar om att program man skriver i C++ gör det man vill mer eller mindre till punkt och pricka och gör man något fel kan allt gå åt helvete, men om man har tungan rätt i mun så är C++ ett oerhört kraftfullt språk (det bygger ju på C så därför har det Cs stora brist att allt kan gå åt helvete om man gör en pytteliten miss, typ en bokstav fel bara)

Tack så mycket ska ta och titta på det.

Likadant sa min lärare att om man inte passar sig så kan mycket gå på tok. Han visade även några exempel. Tex om man skrev utanför en array så är regeln så att c får göra vad det vill, till och med dränka dig i toan eller förgifta din farmor. Han sa också att "C är skrivet av programmerare och för programmerare". Han refererade säkert från någon C bok.

Visa signatur

..hmmm.........få se nu......hmmmm.

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av hoena
Han sa också att "C är skrivet av programmerare och för programmerare". Han refererade säkert från någon C bok.

Vem programmerar om inte programmerare?

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av Koaesica
Vem programmerar om inte programmerare?

Hehe ja du. Det är väl menat så att C är till för dem som kan sin sak och inte lekstuga. Va vet jag!

Visa signatur

..hmmm.........få se nu......hmmmm.

Permalänk
Citat:

Ursprungligen inskrivet av Koaesica
Vem programmerar om inte programmerare?

Vad de menar är att C inte försöker hjälpa en att undvika onödiga fel i samm utsträckning som andra språk. Genom att formulera det på det viset antyder de att om man får svåra buggar när man kodar i C/C++ så är det för att man inte är en "riktig programmerare".

(det är iaf min gissning på vad de menar, kanske kan tolkas annorlunda?)

Visa signatur

Python-IRC på svenska: #python.se

Permalänk
Medlem

Hej!

Jag skulle vilja fråga dig lite exakt vad det är du ska göra?

DirectShow är komplicerat och du kanske kan komma undan utan att använda det beroende på vad du ska göra. Du får räkna med att lägga ner många timmar (kanske månader) för att förstå DirectShow.

Edit: om du berättar lite mer om vad du vill göra så kan jag försöka hjälpa dig att hitta exempelkod. DirectShow eller andra varianter.

Edit2:

Citat:

Och för sjutton, använd C# istället för C++! Det finns en anledning till att MS utvecklade .NET, och jag lovar att det inte beror på att det är lätt att skriva robust och korrekt C++ kod.

Det finns vissa saker i DirectShow som inte går att göra i c#. Och det är inte helt enkelt att skriva robust och korrekt c#-kod heller även om språket gör det lite enklare i många fall.

Visa signatur

Daniel

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av sumpan
Hej!

Jag skulle vilja fråga dig lite exakt vad det är du ska göra?

DirectShow är komplicerat och du kanske kan komma undan utan att använda det beroende på vad du ska göra. Du får räkna med att lägga ner många timmar (kanske månader) för att förstå DirectShow.

Edit: om du berättar lite mer om vad du vill göra så kan jag försöka hjälpa dig att hitta exempelkod. DirectShow eller andra varianter.

Edit2:

Det finns vissa saker i DirectShow som inte går att göra i c#. Och det är inte helt enkelt att skriva robust och korrekt c#-kod heller även om språket gör det lite enklare i många fall.

Tack så mycket, precis vad jag ville höra ^^.

Jag har granskat endel ljudbibliotek som jag nästan har förstått. Jag har iaf lagt ner minst 40h på att letarunt läsa artiklar m.m. bla directshow men som verkar mycket komplicerat.

Det som ska göras är att konventera ljudsignalen ("ljuddata") till en tidkod. Jag har inte rigtigt kommit underful med hur det ska gå till. oftast är det en int eller flout som man får tillbaka om jag fattat det rätt. I tidkoden är 80bitar ber frame och data ligger på olika ställen på de 80 bitarna. Det är en så kallad LTC dekoder som jag ska göra. Tex bit 1-2 är antal min, 3-4 är kontroll bit, 5-6 antal timmar, 60-80 är så kallade userbits osv. skulle även vara bra att kuna läsa inte bara från insignalen på ljudkotet utan från en wave fil också.

Visa signatur

..hmmm.........få se nu......hmmmm.

Permalänk
Medlem

Är detta vad du syftar på med LTC?

http://en.wikipedia.org/wiki/Linear_timecode

Ok, såvitt jag kan förstå så behöver du endast kunna få ut om du har någon signal eller inte...

Det låter lite som en skoluppgift det här, i så fall är ju tanken att du ska komma på lösningen själv. Men jag hittade ett projekt på Codeproject med vilket du kan spela in ljud i C#:

http://www.codeproject.com/cs/media/cswavrec.asp

Jag har bara kollat på det jättesnabbt (jag har inte ens laddat ner projektet) men det ser ut att vara allt du behöver för att spela in ljud. Sedan så måste ju signalen processas med lite annan logik för att få ut det du behöver för LTC-kodningen.

Visa signatur

Daniel

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av sumpan
Är detta vad du syftar på med LTC?

http://en.wikipedia.org/wiki/Linear_timecode

Ok, såvitt jag kan förstå så behöver du endast kunna få ut om du har någon signal eller inte...

Det låter lite som en skoluppgift det här, i så fall är ju tanken att du ska komma på lösningen själv. Men jag hittade ett projekt på Codeproject med vilket du kan spela in ljud i C#:

http://www.codeproject.com/cs/media/cswavrec.asp

Jag har bara kollat på det jättesnabbt (jag har inte ens laddat ner projektet) men det ser ut att vara allt du behöver för att spela in ljud. Sedan så måste ju signalen processas med lite annan logik för att få ut det du behöver för LTC-kodningen.

Ja, Jag menade precis så med LTC.

Nej det är inte ett skolprojekt utan ett vanligt en så länge hobby projekt.

Jag har redan granskat det där och några andra projekt på codeproekt. Det var lite lurigt tyckte jag att förstå funtionerna och kopplingarna mellan classerna. Lyckades något sådär men satt sedan fast hur jag skulle lösa kalla det "översättning" till LTC. det finns ett färdigt linux program skrivet i C och som använder gtk som jag ska omvandla så det fungerar på windows. Saken är den att det är nästan lättare att skiva om hela programmet eftersom programmet användersig av gtk objekt m.m.

Här är lite kod från linuxprogrammet som är användbart:

void timecode_changed(TimecodeSource *source, TimePosition tc, const GTimeVal *when, gpointer data) { GtkLabel *label = data; gchar buffer[13]; g_snprintf(buffer, 13, "%02d:%02d:%02d:%03d", (tc / (TIME_POSITION_FRACTIONS * 3600)) % 60, (tc / (TIME_POSITION_FRACTIONS * 60)) % 60, (tc / TIME_POSITION_FRACTIONS) % 60, (tc % TIME_POSITION_FRACTIONS)); gtk_label_set_text(label, buffer); } static void user_bits_changed(TimecodeSource *source,UserBits ub, gpointer data) { GtkLabel *label = data; gchar buffer[9]; g_snprintf(buffer, 9, "%08x",ub); gtk_label_set_text(label, buffer); } static void frame_rate_changed(TimecodeSource *source, UserBits ub, gpointer data) { GtkLabel *label = data; gchar buffer[4]; g_snprintf(buffer, 4, "%d",ub); gtk_label_set_text(label, buffer); } static void tc_valid_changed(TimecodeSource *source, gboolean valid, gpointer data) { GtkToggleButton *check = data; gtk_toggle_button_set_active(check, valid); }

Visa signatur

..hmmm.........få se nu......hmmmm.

Permalänk
Medlem

Förstår du hur signalen som kommer in på mic-ingången ser ut?

Det du ska göra är att upptäcka skiftningarna mellan av och på i ljudsignalen. Genom det kan du läsa ut om en bit är en etta eller en nolla. Dessa bitar läggs sedan ihop till den 80 bitar långa tidkoden.

Koden du klistrat in är ju bara för att skriva ut saker i gui:t utifrån den 80 bitar långa tidkoden. Det sker lite "signalbehandling" på något annat ställe i koden. Det är den delen som är det kluriga i den här uppgiften.

Edit: om du har tillgång till och kan matlab så skulle det vara ett utmärkt verktyg för att utveckla den algorithm du behöver.

Visa signatur

Daniel

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av sumpan
Förstår du hur signalen som kommer in på mic-ingången ser ut?

Nja, det är det jag inte riktigt har förstått. Jag har hört något om att man ska se skiftningar som du sa, men i C# har jag inte fatat det alls om det är samma där.

Citat:

Det du ska göra är att upptäcka skiftningarna mellan av och på i ljudsignalen. Genom det kan du läsa ut om en bit är en etta eller en nolla. Dessa bitar läggs sedan ihop till den 80 bitar långa tidkoden.

Jo det är ungifär så jag har fattat det. Men har inte fattat hur det ska gå till med de 80 bitarna om man ska lägga dem i någon multiarray eller hur det nu ska se ut.

Citat:

Koden du klistrat in är ju bara för att skriva ut saker i gui:t utifrån den 80 bitar långa tidkoden. Det sker lite "signalbehandling" på något annat ställe i koden. Det är den delen som är det kluriga i den här uppgiften.

Jo det var de jag anade att det är bara där man skriver ut. Det är väl "signalbehandlingen" som jag inte hittat och förstått. Det är just den delen jag har fasnat vid.

Citat:

Edit: om du har tillgång till och kan matlab så skulle det vara ett utmärkt verktyg för att utveckla den algorithm du behöver.

Hmm, matlab har jag aldrig använt men ska ta en titt.

Här lägger jag upp de två programfilerna. Om det är någon mer "include" fil du vill se så säg till.

http://hoena.org/hoena/ltc/

Visa signatur

..hmmm.........få se nu......hmmmm.

Permalänk
Medlem

Jag skulle gissa att det är i "TimecodeSource" som avkodningen av signalen sker.

Om du har tillgång till den signal som du får in till programmet så borde du spela in den signalen till en wav-fil, t ex med ljudinspelaren i windows. Eller så kanske du kan ladda ner en sådan fil någonstans på nätet.

Sedan om du kollar på den i ett wav-editeringsprogram så ser du vad som kommer in. Sedan får du kolla hur signalen ska se ut för att det ska vara en etta respektive en nolla.

Genom att kolla tid sedan förra skiftningen så borde du kunna se om det är en etta eller nolla som du tar emot. När du kan detektera ettor och nollor i signalen så får du lagra dessa i någon struktur och börja kolla efter synk-sekvensen.

Osv osv, jag måste laga söndagsmiddag nu. Men börja med att kolla på hur insignalen ser ut alternativt försöka använda Timsource-objektet för att slippa skriva den delen själv.

Visa signatur

Daniel

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av sumpan
Jag skulle gissa att det är i "TimecodeSource" som avkodningen av signalen sker.

Om du har tillgång till den signal som du får in till programmet så borde du spela in den signalen till en wav-fil, t ex med ljudinspelaren i windows. Eller så kanske du kan ladda ner en sådan fil någonstans på nätet.

Sedan om du kollar på den i ett wav-editeringsprogram så ser du vad som kommer in. Sedan får du kolla hur signalen ska se ut för att det ska vara en etta respektive en nolla.

Genom att kolla tid sedan förra skiftningen så borde du kunna se om det är en etta eller nolla som du tar emot. När du kan detektera ettor och nollor i signalen så får du lagra dessa i någon struktur och börja kolla efter synk-sekvensen.

Osv osv, jag måste laga söndagsmiddag nu. Men börja med att kolla på hur insignalen ser ut alternativt försöka använda Timsource-objektet för att slippa skriva den delen själv.

Aaa, det börjar klarna lite. Jag har en wave fil med en inspelad signal som man kan testa med. Så det bästa är att först köra från wavefil och sen från insignalen på ljudkortet. Jag la ut lite till filer om du är intresserad bla "Timsource" i undermappen synk/.

http://hoena.org/hoena/ltc/

Visa signatur

..hmmm.........få se nu......hmmmm.

Permalänk
Medlem

Utseendet på wav-filen kommer att på något sätt likna grafen av manchester-encoding som finns på följande bild:

http://en.wikipedia.org/wiki/Image:Manchester_encoding_both_c...

Mer om Manchester-encoding här:

http://en.wikipedia.org/wiki/Manchester_code

Du kan ju börja med att försöka koda av den signalen, sedan när du har bitarna så är det ju enkelt att läsa ut tiden.

Jag tror det första du måste göra är att bestämma dig för om du vill använda den färdiga koden eller implementera din egen. Jag tror egentligen att det är lättare att göra din egen implementation eftersom den andra koden ser ut att använda mycket gobject.

Mer kan jag tyvärr inte hjälpa dig just nu, jag vill ju inte lösa den roligaste biten av uppgiften till dig...dessutom måste jag jobba lite...

Visa signatur

Daniel

Permalänk
Medlem

Det är just avkodningen av signalen som jag har svårt för och fasnat vid . Hur man går till väga för att hanterar bitar i c++/c# vet jag heller inte hur det går till.

Just nu ligger signalen på en wav fil som jag ska avkoda till tidkoden. Kod för att läsa wave filer har jag hittat både till c++ och c# på codeproject.com men det man läserin skickas oftast direkt ut till ljudkortet med någon komplicerad funtion. Men i detta fall ska det inte skickas till ljudkortet utan hanteras och det är där jag sitter fast.

Jag har bestämt mig för att implementera min egna kod eftersom den färdiga använder bla gobjekt och man får mer koll över hur allt fungerar sen.

Jag har nu tittat på signalen i en wave editor och jag blev inte så mycket klokare hur jag ska avkoda signalen.

Visa signatur

..hmmm.........få se nu......hmmmm.

Permalänk
Medlem

Om du skickar ett pm med din mail-adress så kan jag försöka skriva en längre förklaring i ett mail men just nu har jag inte tid. Extremt mycket på jobbet den här veckan...

Visa signatur

Daniel

Permalänk
Medlem

Så här långt har jag kommit och förstår.

Jag har hittat kod på codeprojekt för att läsa från wav fil samt ljudingång på ljudkortet.
Jag har en Wav fil med ljudsignalen.
Jag har sett hur signalen ser ut.
Jag vet hur bitarna ska översättas till tidkoden(LTC).
Jag har ungefär förstått att man ska se när signalen är + eller - och då registrera en 1:a eller 0:a

Jag är väl inte helt vän med hur koden på codeproject fungerar. Det jag fastnat mest vid är att översätta signalen till bitar alltså 1: or och 0: or. Det är väl själva bitprogrammeringen som jag inte kan.

Går det att lösa i C# eller måste man avnäda C++?

Visa signatur

..hmmm.........få se nu......hmmmm.