'listenUp_file_receive',
'description' => 'listenUp_file_receive',
'page callback' => 'AudioRecordingField_file_receive',
'type' => MENU_CALLBACK,
'access callback' => true,
);
return $items;
}
/*
* listenUp recorder applet callback. This is what happens when
* 'send' is pressed in the applet
*/
function AudioRecordingField_file_receive(){
header("Cache-control: private");
header("Content-Type: text/plain");
$field_id = $_GET['field_id'];
//TODO save duration in field
$duration = strip_tags($_POST['duration']);
$tmp_name = $_FILES['userfile']['tmp_name'];
$upload_dir = file_directory_path();
$c = (file_check_directory($upload_dir,0))? 1:0;
print("file folder writeable? $c");
// TODO: get file extension from real file type
$new_name = file_create_filename(time().'.wav');
$new_path = $upload_dir.$new_name;
if($_FILES['usefiles']['error']>0){
print("ERROR - error code: ".$_FILES['userfile']['error']."\n");
$fid = "NULL";
}else{
$_FILES['files'] = $_FILES['userfile'];
$_FILES['files']['name'] = $new_name;
foreach($_FILES['files'] as $key=>$value){
$_FILES['files'][$key] = array(0 => $value);
}
var_export($_FILES);
if(!$file = file_save_upload(0,NULL,$upload_dir)){
print("ERROR - file_save_upload failed\n");
$fid = "NULL";
} else{
var_export($file);
$fid = $file->fid;
//convert uploaded wav files to mp3 - does'nt work yet
/*
$ffmpeg_format = 'libmp3lame';
$ffmpeg_extension = 'mp3';
$ffmpeg_frequency = '44100';
$ffmpeg_bitrate = '64k';
$ffmpeg_channels = '2';
$ffmpeg_mime = 'audio/mpeg';
$ffmpeg_path = $field['widget']['ffmpeg_path'] ?
$field['widget']['ffmpeg_path'] : '/usr/bin/ffmpeg';
$ffmpeg_arguments = '-y -i ' . $file->filepath . ' ' .
'-f ' . $ffmpeg_extension . ' ' .
'-acodec ' . $ffmpeg_format . ' ' .
'-ar ' . $ffmpeg_frequency . ' ' .
'-ab ' . $ffmpeg_bitrate . ' ' .
'-ac ' . $ffmpeg_channels . ' ' .
$file->filepath.".mp3";
var_export($ffmpeg_arguments);
// Convert the file to one with the fresh file name.
$ffmpeg_results = shell_exec("ffmpeg" . " " . $ffmpeg_arguments);
*/
print("SUCCESS - File havs been uploaded,\n");
}
}
$js = "document.getElementById('$field_id').value='$fid';";
print("CALLJS $js");
}
/**
* Implementation of hook_theme().
*/
function AudioRecordingField_theme() {
return array(
'AudioRecordingField_listenUp' => array(
'arguments' => array('element' => NULL),),
'AudioRecordingField_formatter_listenup_player' =>
array('arguments' => array('element' => NULL)),
'AudioRecordingField_formatter_link_to_file' =>
array('arguments' => array('element' => NULL)),
);
}
/**
* Declare information about a field type.
*
* @return
* An array keyed by field type name. Each element of the array is an associative
* array with these keys and values:
* - "label": The human-readable label for the field type.
*/
function AudioRecordingField_field_info() {
return array(
'AudioRecordingField' => array('label' => 'Audio recorder'),
);
}
/**
* Implementation of hook_field_settings().
*/
function AudioRecordingField_field_settings($op, $field) {
switch ($op) {
case 'database columns':
// value is audio file fid
$columns['value'] = array(
'type' => 'int',
'length' => 12,
'sortable' => FALSE,
'not null' => FALSE);
return $columns;
}
}
/**
* Implementation of hook_field().
*
*/
function AudioRecordingField_field($op, &$node, $field, &$items, $teaser, $page) {
switch ($op) {
case 'presave':
foreach($items as $key=>$value){
if(!empty($value['value'])){
$file = AudioRecordingField_get_file_object($value['value']);
// since the applet, and the file receive scripts saved the
// new recording for an anonymous user, we need to
// update the real uploading user here.
if(file_set_status($file,1)){
global $user;
$file->uid = $user->uid;
//update user columb in file table
drupal_write_record('files', &$file, array('fid'));
}
}
}
break;
case 'load':
// load file data to field
$field_name = $field['field_name'];
foreach($items as $key=>$value){
$n[$field_name][$key]['value'] = $value['value'];
$n[$field_name][$key]['file'] = AudioRecordingField_get_file_object($value['value']);
}
return $n;
break;
}
}
/**
* Implementation of hook_content_is_empty().
*
*
* This function tells the content module whether or not to consider
* the $item to be empty. This is used by the content module
* to remove empty, non-required values before saving them.
*/
function AudioRecordingField_content_is_empty($item, $field) {
if (empty($item['value'])) {
return TRUE;
}
return FALSE;
}
/**
* Implementation of hook_widget_info().
*/
function AudioRecordingField_widget_info() {
return array(
'AudioRecordingField_listenUp' => array(
'label' => t('ListenUp audio recorder'),
'field types' => array('AudioRecordingField'),
),
);
}
/**
* Implementation of hook_widget_settings().
*
* Handle the parameters for a widget.
*/
function AudioRecordingField_widget_settings($op, $widget) {
switch ($op) {
case 'form':
$form = array();
$form['recorder'] = array(
'#type' => 'fieldset',
'#title' => t('ListenUp recorder settings'),
);
$form['recorder']['recorder_width'] = array(
'#type' => 'textfield',
'#title' => t('recorder width'),
'#default_value' => isset($widget['recorder_width']) ? $widget['recorder_width']:'',
'#size' => 8,
'#description' => t('ListenUp recorder applet width'),
'#required' => true,
);
$form['recorder']['recorder_height'] = array(
'#type' => 'textfield',
'#title' => t('recorder height'),
'#default_value' => isset($widget['recorder_height']) ? $widget['recorder_height']:'',
'#size' => 8,
'#description' => t('ListenUp recorder applet width'),
'#required' => true,
);
$form['recorder']['recorder_params'] = array(
'#type' => 'textarea',
'#title' => t('recorder params'),
'#default_value' => isset($widget['recorder_params']) ? $widget['recorder_params']:'',
'#size' => 8,
'#description' => t('
ListenUp recorder applet parameters. Add list of params'.
' in the form parameter_name|value,
'.
' full list of optional parameter can be found '.l('here','http://www.javasonics.com/listenup/docs/player_parameters.html').
' and '.l('here','http://www.javasonics.com/listenup/docs/recorder_parameters.html').'.
'),
);
$form['player'] = array(
'#type' => 'fieldset',
'#title' => t('ListenUp player settings'),
);
$form['player']['player_width'] = array(
'#type' => 'textfield',
'#title' => t('player width'),
'#default_value' => isset($widget['player_width']) ? $widget['player_width']:'',
'#size' => 8,
'#description' => t('ListenUp player applet width'),
'#required' => true,
);
$form['player']['player_height'] = array(
'#type' => 'textfield',
'#title' => t('player height'),
'#default_value' => isset($widget['player_height']) ? $widget['player_height']:'',
'#size' => 8,
'#description' => t('ListenUp player applet width'),
'#required' => true,
);
$form['player']['player_params'] = array(
'#type' => 'textarea',
'#title' => t('player params'),
'#default_value' => isset($widget['player_params']) ? $widget['player_params']:'',
'#size' => 8,
'#description' => t('ListenUp player applet parameters. Add list of params'.
' in the form parameter_name|value,
'.
' full list of optional parameter can be found '.l('here','http://www.javasonics.com/listenup/docs/player_parameters.html').
'.
'),
);
return $form;
break;
case 'validate':
if(!is_numeric($widget['recorder_height']) || !is_numeric($widget['recorder_width']) ||
$widget['recorder_height']<=0 || $widget['recorder_width']<=0 ||
!is_numeric($widget['player_height']) || !is_numeric($widget['player_width']) ||
$widget['player_height']<=0 || $widget['player_width']<=0)
form_set_error('recorder_dim',t('ListenUp applets height and widths setting must be numeric integers'));
$m = array();
preg_match('/((.+\|.+)\n)*(.+\|.+)*/',$widget['recorder_params'],$m);
if(strlen($m[0])!=strlen($widget['recorder_params']))
form_set_error('recorder_params',t('illegal parameters structure in !name',array('!name' => 'recorder params')));
$m = array();
preg_match('/((.+\|.+)\n)*(.+\|.+)*/',$widget['player_params'],$m);
if(strlen($m[0])!=strlen($widget['player_params']))
form_set_error('player_params',t('illegal parameters structure in !name',array('!name' => 'player params')));
case 'save':
$save = array('recorder_width','recorder_height','player_width','player_height','recorder_params','player_params');
return $save;
}
}
/**
* Implementation of hook_widget().
*/
function AudioRecordingField_widget(&$form, &$form_state, $field, $items, $delta = 0) {
$element = array(
'#type' => $field['widget']['type'],
'#default_value' => isset($items[$delta]) ? $items[$delta] : '',
);
return $element;
}
/**
* Implementation of FAPI hook_elements().
*
* Any FAPI callbacks needed for individual widgets can be declared here,
* and the element will be passed to those callbacks for processing.
*
* Drupal will automatically theme the element using a theme with
* the same name as the hook_elements key.
*
*/
function AudioRecordingField_elements() {
return array(
'AudioRecordingField_listenUp' => array(
'#input' => TRUE,
'#process' => array('AudioRecordingField_listenUp_process'),
),
);
}
/**
* Process an individual element.
*
* Build the form element. When creating a form using FAPI #process,
* note that $element['#value'] is already set.
*
* The $fields array is in $form['#field_info'][$element['#field_name']].
*/
function AudioRecordingField_listenUp_process($element, $edit, $form_state, $form) {
$field = $form['#field_info'][$element['#field_name']];
$field_key = $element['#columns'][0];
$element['applet'] = array(
'#required' => $element['#required'],
'#value' => AudioRecordingField_recorder_applet_marup($element,$field['widget'])
);
// this would be the hidden field the applet would insert the newly
// uploaded file fid to.
$element[$field_key] = array(
'#type' => 'hidden',
'#title' => t($field['widget']['label']),
'#required' => $element['#required'],
'#default_value' => isset($element['#value'][$field_key]) ? $element['#value'][$field_key] : "",
);
return $element;
}
/**
* Implementation of hook_field_formatter_info().
*/
function AudioRecordingField_field_formatter_info() {
return array(
'listenup_player' => array(
'label' => t('ListenUp player'),
'field types' => array('AudioRecordingField'),
'multiple values' => CONTENT_HANDLE_CORE,
),
'link_to_file' => array(
'label' => t('Link to file'),
'field types' => array('AudioRecordingField'),
'multiple values' => CONTENT_HANDLE_CORE,
),
);
}
/*
* listenUp player formatter theme
*/
function theme_AudioRecordingField_formatter_listenup_player($element){
$field = content_fields($element['#field_name']);
return AudioRecordingField_player_applet_markup($element,$field['widget']);
}
/*
* link to file formatter theme
*/
function theme_AudioRecordingField_formatter_link_to_file($element){
$file = $element['#item']['file'];
$output = "";
if(!empty($file)){
$url = file_create_url($file->filename);
$output = l($file->name,$url,array('attributes' => array('class' => 'AudioRecordingField_item')));
}
return $output;
}
/*
* player applet html markup
*/
function AudioRecordingField_player_applet_markup($element,$widget){
$value = $element['#item']['value'];
$file = $element['#item']['file'];
$url = file_create_url($file->filename);
$width = isset($widget['player_width'])? $widget['player_width']:300;
$height = isset($widget['player_height'])? $widget['player_height']:100 ;
$params = $widget['player_params'];
$params_str = AudioRecordingField_build_params($params);
$output = "";
if(!empty($value)){
$output = '';
}
return $output;
}
/*
* listenUp recorder applet
*/
function AudioRecordingField_recorder_applet_marup($element,$widget){
$field_id = $element['#id']."-value";
$url = url('listenUp_file_receive',array('query'=>array('field_id'=>$field_id)));
$width = isset($widget['player_width'])?$widget['recorder_width']:300;
$height = isset($widget['player_height'])? $widget['recorder_height']:100;
$params = $widget['recorder_params'];
$params_str = AudioRecordingField_build_params($params);
$sampleURL = "";
if(!empty($element['#value']['value'])){
$file = $element['#value']['file'];
$surl = file_create_url($file->filename);
$sampleURL = "";
}
$output = '';
return $output;
}
/**
* FAPI theme for an individual elements.
*
* $element['#field_name'] contains the field name
* $element['#delta] is the position of this element in the group
*/
function theme_AudioRecordingField_listenUp($element) {
return $element['#children'];
}
/*
* retrives a file object from the db.
*/
function AudioRecordingField_get_file_object($fid){
$sql = "SELECT * FROM {files} f WHERE f.fid='".$fid."'";
$res = db_query($sql);
return db_fetch_object($res);
}
/*
* parse a "name|value" string to a string of applet parameters tags
*/
function AudioRecordingField_build_params($params){
$params_arr = array();
$params_str = "";
if(preg_match_all('/[\w\d_]+\|[\w\d_]+/',$params,$params_arr)){
foreach($params_arr[0] as $val){
$pair = explode('|',$val);
if(count($pair) ==2)
$params_str.= '';
}
}
return $params_str;
}