Integrere Dolby Audio API med Marmalade

Integrating Dolby Audio API med Marmalade
4
Del
en
Del
Dette Cyber ​​mandag Envato Tuts + kurs vil bli redusert til bare $ 3. Ikke gå glipp av.
Sponset Innhold

Dette sponset post har et produkt som er relevant for våre lesere mens møte våre redaksjonelle retningslinjer for å være objektiv og pedagogisk.
Hva du skal lage
Innledning

Hvis du utvikler en mobil app som har noen form for lydutgang, det være seg et spill eller noen annen form for app, vil du ønsker lyd til å høres best det muligens kan på hver enhet er det kompatibelt med.

Noen mobile enheter støtter Dolby Digital Plus, særlig Kindle Fire-serien, men også et økende antall andre Android-enheter. Dolby Digital Plus kan dramatisk forbedre lydutgangen på din app ved å bruke filtre som kan øke visse deler av lydutgang, for eksempel musikk eller tale. Dette kan høres ut som en komplisert ting å oppnå, men heldigvis Dolby har gitt et API som gjør bruk denne funksjonaliteten utrolig enkel.

I denne opplæringen vil du lære hvordan du kan utvikle en app bruker Marmalade SDK som kan dra nytte av Dolby Digital Plus bruker Dolby Audio API Marmalade forlengelse. Hvis du bare er interessert i å integrere Dolby Audio API i din Marmalade søknad, så hodet til bunnen av denne artikkelen.

1. Oversikt

Programmet vi skal opprette i denne opplæringen vil gi et enkelt brukergrensesnitt som inneholder en øverste raden med knapper som kan starte og stoppe ulike typer lyd, og en bunn rad med knapper for å angi hvilken type audio filtrering som må brukes.

Vi vil først opprette en ny Marmalade prosjekt, og mappene og kildefiler som vil gjøre opp prosjektet.

Neste jeg skal forklare hvordan implementere brukergrensesnittet ved å laste et bilde som inneholder de nødvendige knapp bilder og tegne ulike deler av det på skjermen. Jeg vil også illustrere hvordan du bruker Marmalade å svare på bruker innslag.

Når brukergrensesnittet er oppe og går, skal jeg vise deg hvordan du gjør Marmalade spille to forskjellige typer lyd, komprimert lyd, for eksempel en MP3-fil, og rå lyd sample data.

Til slutt vil jeg integrere Dolby Audio API inn i app og gjøre bruk av de forskjellige lyd filtertyper det gir.

Gjennom denne opplæringen , vil jeg anta at du utvikler på en maskin som kjører Windows og allerede har Marmalade SDK og en versjon av Microsoft Visual Studio installert. Marmalade kan også brukes med Xcode på OS X, og du bør fortsatt synes det er lett å følge trinnene i denne opplæringen hvis du bruker en Mac for utvikling.

2. Sette opp Marmalade Prosjekt

Trinn 1: Opprette Kilde filer og mappestrukturen

Opprett et toppnivå mappe som heter DolbyTestApp
å inneholde prosjektfiler. Innenfor denne mappen oppretter du en annen mappe som heter kilde
. La oss også opprette filene vi vil være behov i vårt prosjekt. I kilde
mappen oppretter fem tomme filer som kalles button.cpp
, button.h
, main.cpp
, lyd CPP
, og sound.h

Trinn 2:. Opprette MKB File

Opprett en tom fil som heter DolbyTestApp.mkb Anmeldelser i DolbyTestApp
mappe og åpne den i en kode editor. Den MKB-filen er den filen som brukes av Marmalade å konfigurere prosjektet. Det bringer sammen alle dine kilde- og datafiler, og lar deg konfigurere ting som ikonene som brukes av programmet når installert på de ulike plattformer som støttes av Marmalade. Legg til følgende til DolbyTestApp.mkb
fil. Product: {[kilde] (kilde) button.cpp button.h main.cpp sound.cpp sound.h} delprosjekter {iwgeom iwgx}

Den filer delen av en MKB filen brukes til å liste opp alle kildefilene som trengs av prosjektet. Den lar deg også til å søke vilkårlige grupperinger i disse filene og referansefiler fra mer enn én mappe. Gruppene er definert ved hjelp av hakeparenteser, slik at linjen [kilde] vil opprette en gruppe som heter Source. Bruke grupper tillater oss å lage organisatoriske mapper i Visual Studio løsning som vi vil generere i neste trinn.

Avrundede parentes brukes til å angi en mappe der Marmalade bør se etter kildefilene. Linjen (kilde) instruerer Marmalade å se i kildemappen av våre viktigste prosjektmappen. De fem kildefiler for prosjektet er oppført etter denne linjen.

delprosjekter delen lar deg referere til andre kildekode moduler som prosjektet krever. Dette prosjektet vil trenge iwgeom Hotell og iwgx
moduler som er standard komponenter levert av Marmalade SDK

Trinn 3:. Opprette en Visual Studio Prosjekt

Du kan nå bruke MKB-fil for å opprette en Visual Studio løsning som kan brukes til å bygge og teste app. Dobbeltklikk på MKB-filen i Windows File Explorer, som skal automatisk starte Visual Studio og åpne løsningen.

Hvis du tar en titt på DolbyTestApp
mappe, vil du se at noen nye filer har blitt opprettet. Det er en mappe som heter build_dolbytestapp_vcxx
, der xx
del av mappenavnet avhenger av hvilken versjon av Visual Studio du bruker. Denne mappen er brukt av Marmalade å inneholde alle filene som trengs som en del av byggeprosessen, inkludert Visual Studio løsningen fil.

En datamappen har også blitt opprettet, som er der du bør plassere noen ressurser som kreves av app, for eksempel grafikk og lydfiler. To filer har også blitt opprettet automatisk for deg i denne mappen:

app.icf:
en konfigurasjonsfil som lar deg endre app innstillinger, for eksempel den maksimale mengden RAM applikasjonen kan bruke

app.config.txt:
brukes til å definere tilpassede applikasjonsspesifikke parametere som deretter kan brukes i app.icf
fil

For denne opplæringen kan du trygt ignorere disse filene som ingen endringer må gjøres til det.

3. Bygging av brukergrensesnitt

Trinn 1: Implementere hovedprogrammet Loop

La oss begynne å skrive hovedprogrammet løkke for vår app. I Visual Studio åpne Source
mappe i Solution Explorer, dobbeltklikker du på main.cpp
fil, og legge inn følgende kode.
#include "IwGx.h" # include "s3e.h" #include "button.h" #include "sound.h" void Initialise () {} void Terminate () {} void Update () {} void Render () {} int main () { initial (); mens {Update () (s3eDeviceCheckQuitRequest ()!); Render (); } Terminere(); returnere 0;}

Dette kodebiten starter ved å inkludere to Marmalade header filer. IwGx.h
fil erklærer funksjoner og strukturer som utgjør Marmalade IwGx
API, som kan brukes for å gjengi både 2D og 3D-grafikk på en mest mulig effektiv måte på målenheten .

s3e.h
header fil får du tilgang til alle de lavere nivå funksjoner som gir direkte tilgang til slike ting som enhetsinnstillinger, berøringsskjerm input, lyd støtte, og mye mer.

Hovedfunksjonen er selvforklarende. Den starter ved å ringe Initialise, som vil utføre oppsett kreves av app og ender ved å ringe Terminate, noe som vil frigjøre noen ressurser som brukes av programmet.

Hoved mens loop starter etter påkalle Initialise. Avkjørselen tilstanden er lite mer enn en oppfordring til s3eDeviceCheckQuitRequest, som er en Marmalade funksjon som sjekker for å se om en anmodning om å lukke app er mottatt, for eksempel når brukeren har lukket programmet eller operativsystemet har bedt om det å stengt for noen grunn.

Hoved sløyfe kaller bare Update og Render funksjoner kontinuerlig. Update-funksjonen vil bli brukt til ting som å oppdage brukerundersøkelser mens Render er ansvarlig for å utarbeide brukergrensesnittet.

Initialise, Update, Render, og Avslutt funksjonene er tom for øyeblikket, men det app kan bygges og henrettet. Hvis du ønsker å gi det et forsøk i Marmalade Windows Simulator
, velg x86 Debug
alternativ fra Løsning konfigurasjoner
rullegardinmenyen i Visual Studio verktøylinjen , trykk på F7
å bygge app, og F5
å kjøre den. Du skal se noe som ligner på skjermbildet under

Trinn 2:. Legge et bilde

For å vise brukergrensesnittet app kommer til å trenge å ha noen bilder til gjengi, så jeg skal nå vise deg hvordan du legger en PNG-bilde i minnet og få det inn i en tilstand der det kan gjengis på skjermen.

Først legger til følgende linje på toppen av main.cpp
file, under inkluderer uttalelser på toppen:
CIwTexture * gpTexture = NULL;

CIwTexture klassen brukes til å representere et punktgrafikkbilde. I ovennevnte tekstutdrag, jeg erklære en global variabel kalt gpTexture, som vil bli brukt til å lagre en peker til bildet som brukes i appen brukergrensesnitt. Bildefilen vi skal bruke heter ui.png
.

Bildet kan lastes inn i minnet og klargjort for bruk ved å legge til følgende linjer til Initialise funksjonen. Anmeldelser //Initialise Marmalade modulesIwGxInit (); //Opprett en ny CIwTexture og bruke den til å laste GUI bilde filegpTexture = new CIwTexture; gpTexture- > LoadFromFile ("ui.png"); gpTexture- > opp ();

Kallet til IwGxInit utfører alle de nødvendige initialisering trinnene for å tillate appen å trekke til skjermen, som inkluderer å kunne laste inn bildefiler.

gpTexture variabelen brukes til å lagre en peker til en ny forekomst av CIwTexture klassen. Et kall til LoadFromFile metoden med filnavnet på bildet vil laste PNG-fil inn i minnet og konvertere den til et passende format for å gjengi. Bildefilen er spesifisert i forhold til app data-mappen, så du trenger for å sikre den ui.png
filen kopieres til denne mappen.

Kallet til opp metoden vil laste de konverterte bildedata til enhetens videominne, klar til å bli trukket på skjermen.

Det er også viktig at vi rydde opp etter oss, så når programmet avsluttes det bør frigjøre noen ressurser det kan være med. Legg til følgende til Avslutt funksjonen
//Destroy tekstur instancedelete gpTexture;. //Avslutt Marmalade modulesIwGxTerminate ();

Listen biten første ødelegger CIwTexture eksempel, som representerer den ui.png
bilde , som også vil gi ut noe hardware ressurser og minne som brukes av bildet. Kallet til IwGxTerminate utgivelser noen ressurser som opprinnelig ble tildelt av kallet til IwGxInit i Initialise

Trinn 3:. Opprette en knapp Class

Brukergrensesnittet for dette programmet kommer til å trenge noen klikkbar knapper, så la oss lage en ny klasse kalt Button som vil implementere denne atferden. Åpne button.h
fil og skriv inn følgende kode
#ifndef BUTTON_H # definere BUTTON_H # include "IwGx.h" class Button {public:. Button (CIwTexture * apTexture, Int32 øks, Int32 Ay, Int32 aWidth, Int32 aheight, Int32 Au, Int32 AV, Int32 aUWidth, Int32 aVWidth, bool aEnabled); ~ Button (); void Render (); privat: CIwMaterial * mpMaterial; CIwSVec2 mTopLeft; CIwSVec2 mSize; CIwFVec2 MUV; CIwFVec2 mUVSize; bool mEnabled;}; # endif

Konstruktøren for denne klassen brukes til å posisjonere og størrelse på knappen på skjermen, og også for å indikere hvilken del av kildebildet skal vises på knappen. Det indikerer også hvorvidt denne knappen må være aktivert for brukerundersøkelser.

destructor vil frigjøre noen ressurser skapt av konstruktøren mens Render metoden vil, ikke overrask, tegne på knappen på skjermen.

Noen mer Marmalade klasser blir introdusert for medlems variablene i Button klassen. Den CIwMaterial klassen brukes av Marmalade å kombinere bilder med andre gjengi informasjon, for eksempel farge data som kan være nødvendig ved gjengivelse. Den CIwSVec2 klasse er en to-komponent vektor, hvor hver komponent er et 16-bits heltall. Den CIwFVec2 klasse er en annen to-komponent vektor med hver komponent er av type float.

Åpne button.cpp Hotell og legge inn følgende kode for å implementere Button klassen.
#include " button.h "# include" s3e.h "Button :: Button (CIwTexture * apTexture, Int32 øks, Int32 Ay, Int32 aWidth, Int32 aheight, Int32 Au, Int32 AV, Int32 aUWidth, Int32 aVHeight, bool aEnabled) {mpMaterial = ny CIwMaterial (); mpMaterial- > SetTexture (apTexture); flyte lTextureWidth = (float) apTexture- > GetWidth (); flyte lTextureHeight = (float) apTexture- > GetHeight (); mTopLeft.x = ax; mTopLeft.y = ay; mSize.x = aWidth; mSize.y = aheight; mUV.x = (float) AU /lTextureWidth; mUV.y = (float) AV /lTextureHeight; mUVSize.x = (float) aUWidth /lTextureWidth; mUVSize.y = (float) aVHeight /lTextureHeight; mEnabled = aEnabled;}

Konstruktøren for Button klassen starter ved å opprette en ny forekomst av CIwMaterial, som vil bli brukt til å gjengi knappbildet. Hver knapp eksempel har sin egen CIwMaterial eksempel som det gjør det lettere å endre knappens farge. Når CIwMaterial forekomsten blir opprettet, blir CIwTexture eksempel gått inn i konstruktør satt som sitt image.

mTopLeft medlem variabelen brukes til å lagre øverst i venstre hjørne av-knappen på skjermen mens mSize lagrer bredde- og høyde. Disse verdiene er angitt i piksler.

De MUV og mUVSize medlem variabler lagre øverst i venstre hjørne, og dimensjonene på bildet regionen til å bli gjengitt. Disse er spesifisert som et flyttall brøkdel av kildebildet størrelse, med (0, 0) er øverst i venstre hjørne av bildet og (1, 1) er nederst i høyre hjørne.

Verdiene gått inn konstruktøren er spesifisert som piksel forskyvninger i teksturen, så du trenger å konvertere disse til brøkverdier ved å dividere med piksel bredden eller høyden på kildebildet. Det er mulig å finne bildet dimensjoner ved å ringe GetWidth og GetHeight metoder på CIwTexture klassen.

Den neste kodebiten viser klassens destructor. Som du kan se, er alt det har å gjøre slette CIwMaterial forekomsten som ble tildelt i konstruktøren
Button :: ~ Button () {slette mpMaterial;}.

Render metoden vil trekke knappen på skjermen. Den starter ved å sjekke mEnabled medlem variable og setter ambient fargen på CIwMaterial, slik at Button er trukket på full lysstyrke når den er aktivert og litt mørkere når deaktivert. . Et kall til IwGxSetMaterial forteller Marmalade som CIwMaterial eksempel å tegne med og IwGxDrawRectScreenSpace vil føre til at knappen for å bli gjengitt
ugyldig Button :: Render () {if (mEnabled!) MpMaterial- > SetColAmbient (96, 96, 96, 255); annet mpMaterial- > SetColAmbient (255, 255, 255, 255); IwGxSetMaterial (mpMaterial); IwGxDrawRectScreenSpace (& mTopLeft, & mSize, & MUV, & mUVSize);}
Trinn 4: Legging ut brukergrensesnittet

Brukergrensesnittet for app kommer til å automatisk justere til skjermoppløsning på enheten den kjører på, men for å gjøre ting litt enklere vi bare kommer til å støtte liggende retning. Det første trinnet er å tvinge landskapet ved å skrive inn følgende i app.icf
fil.
[S3E] DispFixRot = LANDSCAPEMemSize0 = 12000000 {OS = WINDOWS} WinWidth = 1280WinHeight = 800 {}

Alle innstillinger i app.icf
fil har en gruppe assosiert med dem. Klammer brukes til å betegne en gruppe, så i dette tilfellet linjen [S3E] indikerer innstillingene som følger er en del av S3E
gruppen, som er en gruppe reservert av Marmalade for maskinvarerelaterte innstillinger.

DispFixRot innstillingen vil tvinge skjermen for å alltid være i liggende format. Den MemSize0 innstillingen har også blitt lagt for å øke mengden RAM app har til rådighet. Når du legger til lyd støtte senere i denne opplæringen, vil den ekstra RAM være nødvendig å lagre lyden eksempeldata.

De WinWidth og WinHeight innstillingene brukes til å angi målene på vinduene som brukes når du kjører i simulatoren. Den {OS = WINDOWS} linje sikrer disse innstillingene er kun brukt på Windows-simulator. Den {} linje deaktiverer denne begrensningen slik at eventuelle innstillinger etter det blitt globale innstillingene igjen.

Du kan nå begynne å lage elementene i brukergrensesnittet. Åpne main.cpp
filen og start ved å legge følgende biten etter erklæringen av gpTexture global variabel.
Enum ButtonIDs {BUTTON_AUDIO_LABEL, BUTTON_AUDIO_OFF, BUTTON_AUDIO_MUSIC, BUTTON_AUDIO_SFX, BUTTON_AUDIO_SPEECH, BUTTON_FILTER_LABEL, BUTTON_FILTER_OFF, BUTTON_FILTER_MOVIE, BUTTON_FILTER_MUSIC, BUTTON_FILTER_GAME, BUTTON_FILTER_VOICE, BUTTON_COUNT}; Button * gButton [BUTTON_COUNT]; bool gDolbySupported;

ButtonIDs opplisting gir en praktisk måte å navngi hvert av elementene i brukergrensesnittet. Den gButton array vil lagre pekere til hver av de Button forekomster i brukergrensesnittet og gDolbySupported boolean flagget skal brukes til å deaktivere deler av grensesnittet hvis målenheten ikke støtter Dolby Audio API.

For å opprette de nødvendige Button tilfeller legge til følgende kode i slutten av Initialise funksjon
//Sjekk for Dolby Digital Plus supportgDolbySupported = false;. //Opprett vår grensesnitt buttonsint32 lSize = IwGxGetScreenWidth () /5; Int32 lGap = (Int32 ) ((float) lSize * 0,1f); lSize = (Int32) ((float) lSize * 0.9f); Int32 lRowSize = IwGxGetScreenHeight () /4; Int32 lTopRowX = (IwGxGetScreenWidth () - (4 * lSize) - ( 3 * lGap)) /2; Int32 lTopRowY = lRowSize - (lSize /2); Int32 lBottomRowX = (IwGxGetScreenWidth () - (5 * lSize) - (4 * lGap)) /2; Int32 lBottomRowY = (3 * lRowSize) - (lSize /2); Int32 lLabelWidth = (240 * lSize) /160; Int32 lLabelHeight = (42 * lSize) /160; Int32 lLabelX = (IwGxGetScreenWidth () - lLabelWidth) /2; gButton [BUTTON_AUDIO_LABEL] = new Button ( gpTexture, lLabelX, lTopRowY - lLabelHeight - 10, lLabelWidth, lLabelHeight, 4, 408, 240, 42, false); gButton [BUTTON_AUDIO_OFF] = new Button (gpTexture, lTopRowX, lTopRowY, lSize, lSize, 347, 3, 160, 160 , true); gButton [BUTTON_AUDIO_MUSIC] = new Button (gpTexture, lTopRowX + (lSize + lGap), lTopRowY, lSize, lSize, 175, 3, 160, 160, true); gButton [BUTTON_AUDIO_SFX] = new Button (gpTexture, lTopRowX + (2 * (lSize + lGap)), lTopRowY, lSize, lSize, 2, 173, 160, 160, true); gButton [BUTTON_AUDIO_SPEECH] = new Button (gpTexture, lTopRowX + (3 * (lSize + lGap)), lTopRowY, lSize, lSize, 174, 173, 160, 160, true); gButton [BUTTON_FILTER_LABEL] = new Button (gpTexture, lLabelX, lBottomRowY - lLabelHeight - 10, lLabelWidth, lLabelHeight, 2, 353, 240, 42, false); gButton [BUTTON_FILTER_OFF] = new Button (gpTexture, lBottomRowX, lBottomRowY, lSize, lSize, 347, 3, 160, 160, gDolbySupported); gButton [BUTTON_FILTER_MOVIE] = new Button (gpTexture, lBottomRowX + (lSize + lGap), lBottomRowY, lSize , lSize, 2, 3, 160, 160, gDolbySupported); gButton [BUTTON_FILTER_MUSIC] = new Button (gpTexture, lBottomRowX + (2 * (lSize + lGap)), lBottomRowY, lSize, lSize, 175, 3, 160, 160, gDolbySupported); gButton [BUTTON_FILTER_GAME] = new Button (gpTexture, lBottomRowX + (3 * (lSize + lGap)), lBottomRowY, lSize, lSize, 2, 173, 160, 160, gDolbySupported); gButton [BUTTON_FILTER_VOICE] = new Button ( gpTexture, lBottomRowX + (4 * (lSize + lGap)), lBottomRowY, lSize, lSize, 174, 173, 160, 160, gDolbySupported);

I denne koden blokken, starter vi med å anta Dolby Audio API er ikke støttes av brukerens enhet ved å sette gDolbySupported til false. Deretter blir de IwGxGetScreenWidth og IwGxGetScreenHeight funksjoner brukes til å antyde dimensjonene på skjermen og passende størrelser og posisjoner for brukergrensesnittelementer beregnes. Endelig er en rekke Button tilfeller skapt, definere brukergrensesnittet.

Du har kanskje lagt merke til at knappen instanser for å kontrollere den aktuelle filtertype bruke gDolbySupported variabel for å angi om de skal være aktivert eller ikke. Jeg har jukset litt ved å bruke to funksjonshemmede Button tilfeller å trekke noen etiketter.

Du har nå opprettet brukergrensesnittet, men du bør alltid sørge for at du rydde opp etter deg. Legg til følgende kode blokken på starten av Avslutt funksjonen for å slippe knappen tilfeller når programmet avsluttes
//Destroy Button instancesfor. (Uint32 i = 0; i < BUTTON_COUNT; i ++) {slette gButton [i];}

Hvis du skulle kjøre app på dette punktet, brukergrensesnittet vil bli skapt og ødelagt, men det fortsatt ikke vil bli gjengitt. Du må legge inn følgende kode til Render funksjonen før noe blir vist på skjermen
//Clear skjermen til en blek blueIwGxSetColClear (128, 224, 255, 0); IwGxClear (IW_GX_COLOUR_BUFFER_F | IW_GX_DEPTH_BUFFER_F.); //Render den UIfor (uint32 i = 0; i < BUTTON_COUNT; i ++) {gButton [i] - > Render ();} //Finish gjengivelse og visning på screenIwGxFlush (); IwGxSwapBuffers ();

ovenfor kodebit klarner første skjermen til å lyse blått bruker samtaler til IwGxSetColClear og IwGxClear. Deretter er brukergrensesnittet trekkes ved å ringe Render metoden på hver av de Button tilfeller. Til slutt en oppfordring til IwGxFlush forårsaker all gjengi forespørsler om å bli ferdig før IwGxSwapBuffers gjør brukergrensesnittet faktisk vises på skjermen.

Hvis du bygge og kjøre programmet i Marmalade Windows Simulator
, du bør se to rader med knapper, med den nederste raden trukket mørkere som de er i en funksjonshemmet tilstand



Trinn 5:. Svare på User Input
< p> La oss nå gjøre dette programmet litt mer interaktiv ved å spore touch input fra brukeren. For å starte, må du legge til en ny metode for å Button klassen, så åpen button.h Hotell og legge til følgende metode prototyper.
Void Update (uint32 aTouchState, Int32 øks, Int32 Ay); bool IsReleased ();

Du bør også legge til følgende tilleggs private medlem variabler Button klassen
bool mPressed;. bool mDown; bool mReleased;

Deretter åpen button.cpp
og legge til disse linjene til slutten av klassen konstruktøren for å sikre de nye medlems variablene er initialisert til fornuftige verdier
mDown = false;. mPressed = false; mReleased = false;

Den neste kodeblokken viser implementeringer . av oppdatering og IsReleased metoder
void Button :: Update (uint32 aTouchState, Int32 øks, Int32 Ay) {if avkastning (mEnabled!); //Sjekk om kontakten posisjon er innenfor rammene av //denne knappen AX - = mTopLeft.x; AY - = mTopLeft.y; bool lInBounds = (ax > = 0) & & (aX < mSize.x) & & (ay > = 0) & & (ay < mSize.y); //Tøm utgitt flagget mReleased = false; //Sjekk berøringsskjerm tilstand if (aTouchState & S3E_POINTER_STATE_PRESSED) {//Brukeren har bare berørt skjermen hvis (lInBounds) {mPressed = true; mDown = true; }} Else if (aTouchState & S3E_POINTER_STATE_DOWN) {//Hvis du har trykket knappen, sjekk om brukeren //fortsatt berører inni den if (mPressed) {mDown = lInBounds; }} Else if (aTouchState & S3E_POINTER_STATE_RELEASED) {//Hvis brukeren har sluppet skjermen over en presset //knapp, setter vi utgivelsen flagg for å true if (mPressed & & mDown) {mReleased = true; } //Button er ikke lenger trykkes eller ned! mDown = false; mPressed = false; }} bool Button :: IsReleased () {return mReleased;}

Update metoden tar tre parametere, den nåværende kontakten status og skjermen koordinatene til touch. Du vil lære hvordan du kan få denne informasjonen kort tid. Metoden sjekker først for å se om Button er deaktivert og umiddelbart kommer ut hvis det er. Skjermen koordinater sendes til metoden er deretter kontrollert mot grensene av knappen for å se om Button blir berørt

aTouchState parameter av oppdatering metoden er litt maske består av tre mulige flagg.


S3E_POINTER_STATE_PRESSED er satt når brukeren har bare berørt skjermen

S3E_POINTER_STATE_DOWN er satt mens skjermen blir berørt

S3E_POINTER_STATE_RELEASED settes når brukeren løfter fingeren fra skjermen

Update metoden bruker den nåværende verdien av aTouchState å oppdatere interne medlem variabler i klassen tilsvarende.

IsReleased metoden er trivielt, returnerer den nåværende tilstanden i mReleased variabel.

Vi må gjøre en siste endring Button klassen. I Render metoden, trekker vi den Button litt mørkere mens brukeren trykke på den. Dette visuell tilbakemelding fordeler brukeropplevelsen av søknaden. Endre begynnelsen av Render metoden til følgende:
if (mEnabled!) MpMaterial- > SetColAmbient (96, 96, 96, 255); else if (mDown) mpMaterial- > SetColAmbient (192, 192, 192 , 255), ellers mpMaterial- > SetColAmbient (255, 255, 255, 255);

Med Button klassen oppdatert, du nå må bare legge til noen logikk for å oppdage touch input fra brukeren. Åpne main.cpp
igjen og legge til følgende på tom Update-funksjonen:
//Tillat enheten OS tid til å gjøre sitt processings3eDeviceYield (0); //Update pekeren (faktisk berøre skjermen!) Inputss3ePointerUpdate (); //Les dagens berøringsskjerm innganger og bruke dem til å oppdatere Button statesuint32 lTouchState = s3ePointerGetState (S3E_POINTER_BUTTON_SELECT); Int32 x = s3ePointerGetX (); Int32 y = s3ePointerGetY (); for (uint32 i = 0; i < BUTTON_COUNT; i ++) {gButton [i] - > Update (lTouchState, x, y);}

Kallet til s3eDeviceYield er svært viktig i en Marmalade app som gjør det mulig enhetens operativsystem tid til å håndtere eventuelle hendelser, for eksempel berørings input, innkommende samtaler, etc. s3ePointerUpdate funksjonen tar et øyeblikksbilde av dagens berøringsskjerm status.

Den nåværende tilstanden i første oppdaget touch input blir deretter funnet ved å ringe s3ePointerGetState. Den returnerer en verdi med litt maske jeg beskrev tidligere. De s3ePointer funksjoner er også brukt til å oppdage mus hendelser på desktop operativsystemer. Verdien gått til s3ePointerGetState er S3E_POINTER_BUTTON_SELECT, som vil returnere status for første gang påvist berøring hendelse eller venstre museknapp, avhengig av egenskapene til enheten app kjører på.

s3ePointerGetX og s3ePointerGetY returnere skjermen koordinatene til touch. Vi deretter sløyfe gjennom knappen instanser og ringe Button :: Oppdatering på hver knapp, passerer i dagens berøringsskjerm status og berøring koordinater.

Programmet er nå i stand til å oppdage brukerundersøkelser og knappen tilfeller vil skifte farge når de er presset.

4. Legge Lydavspilling

Trinn 1: Å spille komprimerte lydfiler

Spille komprimerte lydfiler, for eksempel MP3-filer, er utrolig lett i Marmalade. Faktisk tar det bare en eneste linje med kode. Legg til følgende kode blokken til slutten av oppdateringsfunksjonen i main.cpp
//Sjekk for knapp pressesif (gButton [BUTTON_AUDIO_MUSIC] - > IsReleased ()). {S3eAudioPlay ("sort hole.mp3 ");}

Når brukeren trykker og frigjør musikken notat knappen på den øverste raden av knapper, applikasjonen vil kalle s3eAudioPlay funksjon, som vil forsøke å spille av MP3-fil som heter svart-hull .mp3
. Denne filen må finnes i mappe data
prosjektet, slik at den kan plasseres under kjøring

svart-hole.mp3
filen ble hentet fra http:. //www.freesfx.co.uk og ble komponert av Craig Riley (SOCAN)

Trinn 2:. Spille Ukomprimert lydeksempler

Spille ukomprimerte samples er også mulig i Marmalade. Mens det er ikke fullt så enkelt som å spille en komprimert lydfil, er det mer fleksibelt som det tillater deg å spille flere lyder på en gang, mens de fleste enheter vil bare tillate en enkelt komprimert lydspor som skal spilles av når som helst.

Marmalade forventer høres eksempel data til å være i 16-bit signert PCM-format og mest lyd redigering programvare vil tillate deg å spare ut filer i dette formatet bruker WAV-format. Men Marmalade ikke støtter WAV-format direkte, så i forbindelse med denne opplæringen jeg har tatt lydfiler lagret i WAV-format og fjernet header fra filen slik at bare de eksempeldata. For dine egne apps, ville du sannsynligvis ønsker å støtte WAV-filer direkte, men det er utenfor omfanget av denne opplæringen.

Jeg har lagt to lydfiler til mappen som heter data
hunn-counting.raw Hotell og pistol-battle.raw
. De opprinnelige WAV-format filer ble hentet fra http://soundbible.com og har vært utgitt under Attribution 3.0 Creative Commons-lisens.

For å spille en samplet lyd effekt, er det nødvendig å ha de lyddata I minne. Jeg har laget en Sound klasse som vil ta seg av dette for oss. For å implementere denne klassen, åpne opp sound.h Hotell og legge til følgende kode blokken til det:
#ifndef SOUND_H # definere SOUND_H # include "s3e.h" class Sound {public: Sound (const char * apFileName); ~ Sound (); void Play (); privat: int16 * mpSoundData; uint32 mSamples;}; # endif

Deretter åpen sound.cpp Hotell og sette inn følgende kode blokken:
#include "sound.h" Sound :: Sound (const char * apFileName) { //Forsøk å åpne lydeffekt filen s3eFile * f = s3eFileOpen (apFileName, "rb"); if (f) {//Seek til slutten av filen for å finne sin lengde s3eFileSeek (f, 0, S3E_FILESEEK_END); //Antall prøver er filstørrelsen dividert med //størrelsen av en int16 mSamples = s3eFileTell (f) /sizeof (int16); s3eFileSeek (f, 0, S3E_FILESEEK_SET); //Tildele buffer for lyd data mpSoundData = new int16 [mSamples]; //Les lyd data s3eFileRead (mpSoundData, sizeof (int16), mSamples, f); //Lukk filen s3eFileClose (f); } Else {//File open mislyktes, null medlemsvariablene mpSoundData = NULL; mSamples = 0; }} Sound :: ~ Sound () {if (mpSoundData) slette [] mpSoundData;} void Sound :: Play () {if (mpSoundData) {int lChannel = s3eSoundGetFreeChannel (); s3eSoundChannelPlay (lChannel, mpSoundData, mSamples, 0, 0); }}

Konstruktøren tar filnavnet til en lydeffekt og finner lengden av filen i byte. En rekke 16-bits signert heltall er opprettet, stor nok til å holde hele lyden, og filen leses inn i denne bufferen. Destructor sletter denne bufferen.

Play metoden vil faktisk begynne lyden prøve å spille. Den gjør dette ved først å spørre Marmalade for en gratis lyd-kanal med en oppfordring til s3eSoundGetFreeChannel.