Free DNS provides easy shared DNS hosting & URL forwarding

Wednesday, July 29, 2009

Nanogong applet how-to

This is a compilation of the notes I tookon nanogong appet. I think I got everything here and I didn't missed anything.

The nanogong applet accepts the following (optional) parameters:

  • SoundFileURL = URL = address of a sound file that should be loaded on applet init (default "")
  • Start = true|false = if true, the applet will start playing the file from SoundFileURL after loading (default false)
  • ShowAudioLevel = true|false = if true, it displays the audiometer (i.e. VU meter) (default true)
  • ShowRecordButton = true|false = if true, it displays the record button (default true)
  • ShowSpeedButton = true|false = if true, it displays the faster/slower playback buttons (default true)
  • ShowSaveButton = true|false = if true, it displays the saved file locally button (default true)
  • Color = HTML color (including # prefix) = the color of the applet's background (default #FFFFFF)
  • AudioFormat = ImaADPCM|Speex = the codec used for sound encoding (default Speex)
  • SamplingRate = integer = the sampling rate of the sound recording (default 44100); allowed values depend on the AudioFormat:
    • 8000|11025|22050|44100 = for IMA_ADPCM audioformat
    • 8000|16000|32000|44100 = for Speex audioformat
  • SpeexQuality = 1...10 = quality of sound compression for the speex codec (1 = lowest, 10 = highest quality) (default: 10)

Appart from SoundFileURL and Start parameters, which allow sound to be played as soon as the applet is loaded, the nanogong applet can be controlled using the sendGongRequest method. In order to do this, the applet should have an id, which makes it easy to get a reference to it in JavaScript. Here's an example:

<applet id="nanogong" archive="nanogong.jar" code="gong.NanoGong" width="180" height="40"></applet>

var recorder = document.getElementById('nanogong');
if (recorder == null) {
 alert("recorder not found");
var result = recorder.sendGongRequest(...request name..., ...parameters...);

The following requests names (and parameters) are accepted (including returned values, but without quotes):

  • playMedia StartTime EndTime - plays the media between the StartTime (optional; default: current position) and EndTime (optional; default: end of sound) seconds; return value is "StartTime;EndTime" (values parsed by the applet)
  • recordMedia Duration - record Duration (optional; default: maximum accepted) seconds of sound; return value is "Duration" (values parsed by the applet)
  • pauseMedia - pause the media playback or recording; return value is "Time" (current playback time)
  • stopMedia - stops the media playback or recording; return value is "" (if playback) or "Duration" (total recording time, if recording)
  • setMediaTime Time - sets the current playback time; return value is "Time" (value parsed by the script)
  • getMediaTime - gets the current playback time; return value is "Time" (current playback time)
  • getMediaDuration - gets the total playback time; return value is "Time" (total playback time)
  • setMediaRate Rate - sets the playback rate (between 0.5 and 1.5); return value is "Rate" (value parsed by the script)
  • getMediaRate - gets the playback rate (between 0.5 and 1.5); return value is "Rate" (current playback rate)
  • getMediaStatus - gets the current status: playing, recording,paused, paused recording, stopping, stopped, closing, or closed; return value is "Status"
  • getAudioLevel - gets the current audio level (in 0.00 format); return value is "Audio level"
  • saveMessage Type Filename Path - saves the audio file (many features)
  • postToForm URL Parameter Cookies Filename - send the sound file via HTTP post to the URL address (including the Cookies), with the file send as the Parameter form item and with local name Filename; return value is the response of the server.
  • loadFromURL URL Start - load the sound file from the URL and playsit if Start=true; return value is "URL" (value parsed by the applet)
  • getVersion - gets the applet version number; return value is "Version"

Here's an exemple that also uploads the registered message (2 files in the same directory):

File: record.php
if(isset($_GET['save'])) {
  move_uploaded_file($_FILES['sndfile']['tmp_name'], '/tmp/' .
  echo 'Your file have been saved.';
<html xmlns="">
  <title>The NanoGong Applet</title>
  <script src="nanogong.js" type="text/javascript" language="javascript"/>
  <h1>The NanoGong Applet</h1>
  <applet id="nanogong" archive="nanogong.jar" code="gong.NanoGong"
width="180" height="40">
  <param name="AudioFormat" value="ImaADPCM" />
  <input type="button" onclick="sendFile('nanogong')" value="Send" />

function sendFile(applet_id) {
var recorder = document.getElementById(applet_id);
if (recorder == null) {
  alert("recorder not found");

var duration =parseInt(recorder.sendGongRequest("GetMediaDuration", "audio")) || 0;
if (duration <= 0) {
  alert("no recording found");

// upload the voice file to the server
var msg = recorder.sendGongRequest("PostToForm","record.php?save=1", "sndfile", "cookie=SomeText", "myfile");

The problem with the current applet is that it is not signed and it contains code for saving files locally. This makes browsers to ask the user if they trust the applet publisher. This is annoying and it may raise concerns for unfamiliar users. There are three solutions to this problem:

  • leave it as it is (maybe show a message to the user, explaining what the browser is complaining about)
  • sign a copy of the nanogong.jar file with some valid certificate (maybe a moodle certificate)
  • delete the local file saving code (not very important), recompile the applet and hope that the browser will not complain anymore.

No comments:

Post a Comment