Skip to content

Commit

Permalink
Added basic media support (WAV and MP3 for now) and updated demo to r…
Browse files Browse the repository at this point in the history
…eflect.
  • Loading branch information
Fil Maj committed Aug 21, 2009
1 parent 1d9ce3e commit 17595eb
Show file tree
Hide file tree
Showing 6 changed files with 104 additions and 4 deletions.
4 changes: 2 additions & 2 deletions winmo/CommandManager.cs
Original file line number Diff line number Diff line change
Expand Up @@ -6,11 +6,11 @@ namespace PhoneGap {

class CommandManager {

private Command[] commands = new Command[1];
private Command[] commands = new Command[2];

public CommandManager() {
commands[0] = new InitializationCommand();
//commands[1] = new MediaCommand();
commands[1] = new MediaCommand();
}

public String processInstruction(String instruction) {
Expand Down
91 changes: 91 additions & 0 deletions winmo/MediaCommand.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,91 @@
using System;
using System.Linq;
using System.Collections.Generic;
using System.Text;
using System.IO;
using System.Reflection;
using System.Runtime.InteropServices;

namespace PhoneGap
{
// Need to invoke unmanaged mobile native code from .NET to play sounds. Woot!
internal partial class PInvoke
{
private static IntPtr hSound = IntPtr.Zero; // Pointer/handle of currently-playing sound.
const int SND_SCOPE_PROCESS = 0x1;
private enum Flags
{
SND_SYNC = 0x0000, /* play synchronously (default) */
SND_ASYNC = 0x0001, /* play asynchronously */
SND_NODEFAULT = 0x0002, /* silence (!default) if sound not found */
SND_MEMORY = 0x0004, /* pszSound points to a memory file */
SND_LOOP = 0x0008, /* loop the sound until next sndPlaySound */
SND_NOSTOP = 0x0010, /* don't stop any currently playing sound */
SND_NOWAIT = 0x00002000, /* don't wait if the driver is busy */
SND_ALIAS = 0x00010000, /* name is a registry alias */
SND_ALIAS_ID = 0x00110000, /* alias is a predefined ID */
SND_FILENAME = 0x00020000, /* name is file name */
SND_RESOURCE = 0x00040004 /* name is resource name or atom */
}


[DllImport("aygshell.dll")]
static extern uint SndOpen(string pszSoundFile, ref IntPtr phSound);

[DllImport("aygshell.dll")]
static extern uint SndPlayAsync(IntPtr hSound, uint dwFlags);

[DllImport("aygshell.dll")]
static extern uint SndClose(IntPtr hSound);

[DllImport("aygshell.dll")]
static extern uint SndStop(int SoundScope, IntPtr hSound);
public static bool PlaySound(string path)
{
if (File.Exists(path))
{
SndOpen(path, ref hSound);
SndPlayAsync(hSound, 0);
return true;
}
else return false;
}
public static void StopSound()
{
SndClose(hSound);
SndStop(SND_SCOPE_PROCESS, hSound);
hSound = IntPtr.Zero;
}
}
class MediaCommand : Command
{
private string soundFileName = "";
private string soundExtension = "";
Boolean Command.accept(String instruction)
{
Boolean retVal = false;
if (instruction.StartsWith("/media"))
{
int firstSlash = instruction.IndexOf('/',5);
soundFileName = instruction.Substring(firstSlash);
soundExtension = soundFileName.Substring(soundFileName.LastIndexOf('.'));
// TODO: Test what other sound file types work.
switch (soundExtension)
{
case ".wav":
case ".mp3":
retVal = true;
break;
}
}
return retVal;
}
String Command.execute(String instruction)
{
Assembly assembly = Assembly.GetExecutingAssembly();
string path = "\\Program Files\\" + assembly.GetName().Name + "\\" + soundFileName.Substring(1).Replace("/","\\");
if (PInvoke.PlaySound(path)) return "";
else return ";alert(\"[PhoneGap Error] Could not find sound file with path '" + path + "'.\");";
}
}
}
8 changes: 6 additions & 2 deletions winmo/www/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -9,16 +9,20 @@
document.getElementById('resultText').innerText = newText;
}
function playApplause() {
media.playSound('data:///www/media/applause.wav');
media.playSound('www/media/applause.wav');
showLabel('CLAP CLAP CLAP!');
}
function playBirds() {
media.playSound('www/media/bird.mp3');
}
</script>
</head>
<body onload="device.init();"> <!-- on load call init to make sure we bridge to device properly-->
<p>This is an HTML page.</p><br />
<a href="javascript:showLabel(device.name);">Show me the device model/name</a><br />
<a href='javascript:showLabel(device.uuid);'>Show me the device UUID</a><br />
<!--<a href="javascript:playApplause();">Play expected audience response ;)</a><br />-->
<a href="javascript:playApplause();">Play applause</a><br />
<a href="javascript:playBirds();">Play birds</a><br />
<br />
<div id="resultLabel" style="width:100%;height:20px;background-color:#dddddd;padding:2px;margin:5px;border:solid 1px black;"><p id="resultText" style="margin:0 auto;"></p></div>
<br />
Expand Down
5 changes: 5 additions & 0 deletions winmo/www/js/media.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
var media = {
playSound: function(filename) {
device.exec("media",[filename]);
}
};
Binary file added winmo/www/media/applause.wav
Binary file not shown.
Binary file added winmo/www/media/bird.mp3
Binary file not shown.

0 comments on commit 17595eb

Please sign in to comment.