Free DNS provides easy shared DNS hosting & URL forwarding
Showing posts with label nanogong. Show all posts
Showing posts with label nanogong. Show all posts

Saturday, August 15, 2009

Completed audio repository plugins

During Google Summer of Code 2009 project I worked on implementing repository plugins that would allow users to record audio files directly into Moodle. Initially, the plan was to provide a single recording only, but things went a bit further, and I also implemented a collection management feature.

Both plugins have integrated help pages for all their features, but additional help (mostly for developers) is in the Record audio repository plugin wiki page. Some discutions focused on audio and/or video recording in Moodle are in the Record audio repository plugin (was Wanted: New feature ideas for GSOC projects) and GSOC: Record Audio/Video directly into resources/activities forums. The later is more general, not only about the repository plugin. Last, but not least, there also a place for feature requests and bug reports in the MDL-18341 ticket.

The plugins are not included in the Moodle releases (not even the 2.0 dev daily build). In order to test them, you'll need to use a 2.0 dev daily build.

The Riffly plugin allows audio-only or audio-video recording inside the Moodle repositories. The flv files are stored on riffly.com servers and, optionally, they can be downloaded into Moodle (to go under Moodle File API control). Recorded files and the recording flash object is available in all places where the repository is used to select files.

After you download a Moodle 2.0 dev build, you'll have to download the plugin manually from CVS and copy the entire riffly folder inside the repository folder of your Moodle instalation. Then go to the Plugins/Repositories entry of the Administration menu, enable the plugin and make it visible. When you're done, you'll have the option to create riffly site-wide, course-wide or per-user collections. For each collection, you can choose what type of content it accepts: audio, audio-video or none of them (to get a locked collection).

The Nanogong plugin allows audio-only recording inside the Moodle repositories. The wav files are stored into Moodle using the File API. The sound files can be recorded using the ImaACPCM or Speex codecs. As for the riffly plugin, recorded files and the recording applet are available in all places where the repository is used to select files.

After you download a Moodle 2.0 dev build, you'll have to download the plugin manually from CVS and copy the entire nanogong folder inside the repository folder of your Moodle instalation. Then go to the Plugins/Repositories entry of the Administration menu, enable the plugin and make it visible. When you're done, you can select the codec used and the quality of the sound for the site-wide recording instance. This instance will be shared by all users of your site (because it only handles recording, and File API handles the rest).

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:

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

JavaScript:
var recorder = document.getElementById('nanogong');
if (recorder == null) {
 alert("recorder not found");
 return;
}
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
------------------------
<?php
if(isset($_GET['save'])) {
  move_uploaded_file($_FILES['sndfile']['tmp_name'], '/tmp/' .
$_FILES['sndfile']['name']);
  echo 'Your file have been saved.';
  exit;
}
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
  <title>The NanoGong Applet</title>
  <script src="nanogong.js" type="text/javascript" language="javascript"/>
</head>
<body>
  <h1>The NanoGong Applet</h1>
  <applet id="nanogong" archive="nanogong.jar" code="gong.NanoGong"
width="180" height="40">
  <param name="AudioFormat" value="ImaADPCM" />
  </applet>
  <input type="button" onclick="sendFile('nanogong')" value="Send" />
</body>
</html>

nanogong.js
------------------------
function sendFile(applet_id) {
var recorder = document.getElementById(applet_id);
if (recorder == null) {
  alert("recorder not found");
  return;
}

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

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

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.

Tuesday, July 21, 2009

Almost there

The riffly plugin repository is almost completed. Jerome is helping me with QA and squashing bugs. The plugin now supports multiple instances (per site, per course and/or per user) and each of this instances can be setup to support only audio media, only video media or audio and video. Also, each instance can be setup to download the riff files locally (for management using Moodle's File API) or to link to the files on riffly.com (very useful, if you have limited storage space or bandwidth).

Meanwhile, I started work on the second plugin, which is using the Java applet nanogong.