Error processing request

Parameters

CONTENT_LENGTH0
REQUEST_METHODGET
REQUEST_URI/revision/VLC+Tcl+Extension?V=6
QUERY_STRINGV=6
CONTENT_TYPE
DOCUMENT_URI/revision/VLC+Tcl+Extension
DOCUMENT_ROOT/var/www/nikit/nikit/nginx/../docroot
SCGI1
SERVER_PROTOCOLHTTP/1.1
REMOTE_ADDR172.69.7.142
REMOTE_PORT41032
SERVER_PORT8888
SERVER_NAMEwiki.tcl-lang.org
HTTP_HOSTwiki.tcl-lang.org
HTTP_CONNECTIONKeep-Alive
HTTP_ACCEPT_ENCODINGgzip
HTTP_X_FORWARDED_FOR18.227.111.33
HTTP_CF_RAY885e3b7d4f6a6161-ORD
HTTP_X_FORWARDED_PROTOhttp
HTTP_CF_VISITOR{"scheme":"http"}
HTTP_ACCEPT*/*
HTTP_USER_AGENTMozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko; compatible; ClaudeBot/1.0; [email protected])
HTTP_CF_CONNECTING_IP18.227.111.33
HTTP_CDN_LOOPcloudflare
HTTP_CF_IPCOUNTRYUS

Body


Error

Unknow state transition: LINE -> END

-code

1

-level

0

-errorstack

INNER {returnImm {Unknow state transition: LINE -> END} {}} CALL {my render_wikit {VLC Tcl Extension} **VLC\ Tcl\ Extension**\n\n\[bll\]\ 2016-12-28\ :\ One\ full\ day's\ work.\ \ This\ is\ a\ Tcl\ interface\ to\ libvlc,\ which\ comes\ with\ the\ VLC\ media\ player.\ \ The\ tighter\ interface\ gives\ better\ control\ over\ song\ position,\ time\ position\ and\ player\ state.\n\nI\ only\ need\ audio,\ and\ don't\ use\ playlists.\ \ The\ media\ sub-command\ only\ handles\ file\ paths\ right\ now.\ There's\ quite\ a\ bit\ that\ could\ still\ be\ implemented.\ \ But\ most\ of\ that\ implementation\ would\ be\ fairly\ straightforward.\n\nI\ have\ given\ up\ trying\ to\ get\ callbacks\ working.\ \ Calling\ Tcl\ code\ from\ the\ VLC\ event\ handler\ does\ not\ seem\ to\ work\ properly\ on\ Windows.\n\n'''test.tcl'''\n======\n#!/usr/bin/tclsh\n\nset\ os\ \$::tcl_platform(os)\nif\ \{\ \[regexp\ -nocase\ \{^win\}\ \$os\]\ \}\ \{\n\ \ set\ os\ Windows\n\}\n\nload\ \[pwd\]/\$os/tclvlc64\[info\ sharedlibextension\]\ntclvlc\ init\ --intf\ dummy\ --no-video\ --ignore-config\ \\\n\ \ \ \ --no-media-library\ --no-playlist-autostart\ \\\n\ \ \ \ --no-loop\ --no-random\ --no-repeat\ --quiet\ --play-and-stop\ \\\n\ \ \ \ --audio-filter\ scaletempo\n\nif\ \{\ \$os\ eq\ \"Linux\"\ \}\ \{\n\ \ tclvlc\ media\ /home/bll/sources/ballroomdj/test.dir/test-files/counter.mp3\n\}\nif\ \{\ \$os\ eq\ \"Darwin\"\ \}\ \{\n\ \ tclvlc\ media\ /Users/bll/Desktop/BallroomDJ.app/Contents/MacOS/test.dir/test-files/counter.mp3\n\}\nif\ \{\ \$os\ eq\ \"Windows\"\ \}\ \{\n\ \ tclvlc\ media\ \[file\ nativename\ \{C:/Users/bll/Desktop/BallroomDJ/test.dir/test-files/counter.mp3\}\]\n\}\n\ntclvlc\ play\nset\ state\ \[tclvlc\ state\]\nwhile\ \{\ \$state\ eq\ \"opening\"\ ||\ \$state\ eq\ \"buffering\"\ \}\ \{\n\ \ after\ 100\n\ \ set\ state\ \[tclvlc\ state\]\n\}\ntclvlc\ seek\ 0.0387\nset\ ::x\ 0\nafter\ 1000\ set\ ::x\ 1\nvwait\ ::x\ntclvlc\ close\nexit\n======\n\n'''tclvlc.c'''\n======\n/*\n\ *\ Copyright\ 2016-2017\ Brad\ Lanam\ Walnut\ Creek\ CA\ US\n\ *\ MIT\ License\n\ */\n\n#include\ <stdio.h>\n#include\ <stdlib.h>\n#include\ <string.h>\n#include\ <sys/stat.h>\n#include\ <sys/types.h>\n#include\ <tcl.h>\n#include\ <vlc/vlc.h>\n\ntypedef\ struct\ \{\ char\ *name\;\ Tcl_ObjCmdProc\ *proc\;\ \}\ EnsembleData\;\n\ntypedef\ struct\ \{\n\ \ libvlc_state_t\ \ \ \ \ \ \ \ state\;\n\ \ const\ char\ *\ \ \ \ \ \ \ \ \ \ name\;\n\}\ stateMap_t\;\n\nstatic\ const\ stateMap_t\ stateMap\[\]\ =\ \{\n\ \ \{\ libvlc_NothingSpecial,\ \ \"idle\"\ \},\n\ \ \{\ libvlc_Opening,\ \ \ \ \ \ \ \ \ \"opening\"\ \},\n\ \ \{\ libvlc_Buffering,\ \ \ \ \ \ \ \"buffering\"\ \},\n\ \ \{\ libvlc_Playing,\ \ \ \ \ \ \ \ \ \"playing\"\ \},\n\ \ \{\ libvlc_Paused,\ \ \ \ \ \ \ \ \ \ \"paused\"\ \},\n\ \ \{\ libvlc_Stopped,\ \ \ \ \ \ \ \ \ \"stopped\"\ \},\n\ \ \{\ libvlc_Ended,\ \ \ \ \ \ \ \ \ \ \ \"ended\"\ \},\n\ \ \{\ libvlc_Error,\ \ \ \ \ \ \ \ \ \ \ \"error\"\ \}\n\}\;\n#define\ stateMapMax\ (sizeof(stateMap)/sizeof(stateMap_t))\n\ntypedef\ struct\ \{\n\ \ Tcl_Interp\ \ \ \ \ \ \ \ \ \ \ \ *interp\;\n\ \ libvlc_instance_t\ \ \ \ \ *inst\;\n\ \ char\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ version\ \[40\]\;\n\ \ libvlc_media_player_t\ *mp\;\n\ \ libvlc_state_t\ \ \ \ \ \ \ \ state\;\n\ \ int\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ argc\;\n\ \ const\ char\ \ \ \ \ \ \ \ \ \ \ \ **argv\;\n\}\ vlcData_t\;\n\nconst\ char\ *\nstateToStr\ (\n\ \ libvlc_state_t\ \ \ \ state\n\ \ )\n\{\n\ \ int\ \ \ \ \ \ \ \ i\;\n\ \ const\ char\ *tptr\;\n\n\ \ tptr\ =\ \"\"\;\n\ \ for\ (i\ =\ 0\;\ i\ <\ stateMapMax\;\ ++i)\ \{\n\ \ \ \ if\ (state\ ==\ stateMap\[i\].state)\ \{\n\ \ \ \ \ \ tptr\ =\ stateMap\[i\].name\;\n\ \ \ \ \ \ break\;\n\ \ \ \ \}\n\ \ \}\n\ \ return\ tptr\;\n\}\n\nlibvlc_state_t\nstateToValue\ (\n\ \ char\ *name\n\ \ )\n\{\n\ \ int\ \ \ i\;\n\ \ libvlc_state_t\ state\;\n\n\ \ state\ =\ libvlc_NothingSpecial\;\n\ \ for\ (i\ =\ 0\;\ i\ <\ stateMapMax\;\ ++i)\ \{\n\ \ \ \ if\ (strcmp\ (name,\ stateMap\[i\].name)\ ==\ 0)\ \{\n\ \ \ \ \ \ state\ =\ stateMap\[i\].state\;\n\ \ \ \ \ \ break\;\n\ \ \ \ \}\n\ \ \}\n\ \ return\ state\;\n\}\n\nvoid\nvlcEventHandler\ (\n\ \ const\ struct\ libvlc_event_t\ *event,\n\ \ void\ *cd\n\ \ )\n\{\n\ \ vlcData_t\ \ \ \ \ *vlcData\ =\ (vlcData_t\ *)\ cd\;\n\ \ int\ \ \ \ \ \ \ \ \ \ \ objc\;\n\ \ Tcl_Obj\ \ \ \ \ \ \ **objv\;\n\ \ Tcl_Obj\ \ \ \ \ \ \ *tobj\;\n\n\ \ if\ (event->type\ ==\ libvlc_MediaStateChanged)\ \{\n\ \ \ \ vlcData->state\ =\ event->u.media_state_changed.new_state\;\n\ \ \}\n\}\n\nint\nvlcDurationCmd\ (\n\ \ ClientData\ cd,\n\ \ Tcl_Interp*\ interp,\n\ \ int\ objc,\n\ \ Tcl_Obj\ *\ const\ objv\[\]\n\ \ )\n\{\n\ \ int\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ rc\;\n\ \ libvlc_time_t\ \ \ \ \ tm\;\n\ \ double\ \ \ \ \ \ \ \ \ \ \ \ dtm\;\n\ \ vlcData_t\ *vlcData\ =\ (vlcData_t\ *)\ cd\;\n\n\ \ if\ (objc\ !=\ 1)\ \{\n\ \ \ \ Tcl_WrongNumArgs(interp,\ 1,\ objv,\ \"\")\;\n\ \ \ \ return\ TCL_ERROR\;\n\ \ \}\n\n\ \ rc\ =\ TCL_OK\;\n\ \ if\ (vlcData->inst\ ==\ NULL\ ||\ vlcData->mp\ ==\ NULL)\ \{\n\ \ \ \ rc\ =\ TCL_ERROR\;\n\ \ \}\ else\ \{\n\ \ \ \ tm\ =\ libvlc_media_player_get_length\ (vlcData->mp)\;\n\ \ \ \ dtm\ =\ (double)\ tm\ /\ 1000.0\;\n\ \ \ \ Tcl_SetObjResult\ (interp,\ Tcl_NewDoubleObj\ (dtm))\;\n\ \ \}\n\ \ return\ rc\;\n\}\n\nint\nvlcGetTimeCmd\ (\n\ \ ClientData\ cd,\n\ \ Tcl_Interp*\ interp,\n\ \ int\ objc,\n\ \ Tcl_Obj\ *\ const\ objv\[\]\n\ \ )\n\{\n\ \ int\ \ \ \ \ \ \ rc\;\n\ \ libvlc_time_t\ \ \ \ \ tm\;\n\ \ double\ \ \ \ \ \ \ \ \ \ \ \ dtm\;\n\ \ vlcData_t\ *vlcData\ =\ (vlcData_t\ *)\ cd\;\n\n\ \ if\ (objc\ !=\ 1)\ \{\n\ \ \ \ Tcl_WrongNumArgs(interp,\ 1,\ objv,\ \"\")\;\n\ \ \ \ return\ TCL_ERROR\;\n\ \ \}\n\n\ \ rc\ =\ TCL_OK\;\n\ \ if\ (vlcData->inst\ ==\ NULL\ ||\ vlcData->mp\ ==\ NULL)\ \{\n\ \ \ \ rc\ =\ TCL_ERROR\;\n\ \ \}\ else\ \{\n\ \ \ \ tm\ =\ libvlc_media_player_get_time\ (vlcData->mp)\;\n\ \ \ \ dtm\ =\ (double)\ tm\ /\ 1000.0\;\n\ \ \ \ Tcl_SetObjResult\ (interp,\ Tcl_NewDoubleObj\ (dtm))\;\n\ \ \}\n\ \ return\ rc\;\n\}\n\nint\nvlcIsPlayCmd\ (\n\ \ ClientData\ cd,\n\ \ Tcl_Interp*\ interp,\n\ \ int\ objc,\n\ \ Tcl_Obj\ *\ const\ objv\[\]\n\ \ )\n\{\n\ \ int\ \ \ \ \ \ \ rc\;\n\ \ int\ \ \ \ \ \ \ rval\;\n\ \ vlcData_t\ *vlcData\ =\ (vlcData_t\ *)\ cd\;\n\n\ \ if\ (objc\ !=\ 1)\ \{\n\ \ \ \ Tcl_WrongNumArgs(interp,\ 1,\ objv,\ \"\")\;\n\ \ \ \ return\ TCL_ERROR\;\n\ \ \}\n\n\ \ rc\ =\ TCL_OK\;\n\ \ rval\ =\ 0\;\n\ \ if\ (vlcData->inst\ ==\ NULL\ ||\ vlcData->mp\ ==\ NULL)\ \{\n\ \ \ \ rc\ =\ TCL_ERROR\;\n\ \ \}\ else\ \{\n\ \ \ \ /*\n\ \ \ \ \ *\ In\ order\ to\ match\ the\ implementation\ of\ VLC's\ internal\n\ \ \ \ \ *\ isplaying\ command,\ return\ true\ if\ the\ player\ is\ paused\n\ \ \ \ \ */\n\ \ \ \ if\ (vlcData->state\ ==\ libvlc_Opening\ ||\n\ \ \ \ \ \ \ \ vlcData->state\ ==\ libvlc_Buffering\ ||\n\ \ \ \ \ \ \ \ vlcData->state\ ==\ libvlc_Playing\ ||\n\ \ \ \ \ \ \ \ vlcData->state\ ==\ libvlc_Paused)\ \{\n\ \ \ \ \ \ rval\ =\ 1\;\n\ \ \ \ \}\n\ \ \ \ Tcl_SetObjResult\ (interp,\ Tcl_NewIntObj\ (rval))\;\n\ \ \}\n\ \ return\ rc\;\n\}\n\nint\nvlcMediaCmd\ (\n\ \ ClientData\ cd,\n\ \ Tcl_Interp*\ interp,\n\ \ int\ objc,\n\ \ Tcl_Obj\ *\ const\ objv\[\]\n\ \ )\n\{\n\ \ int\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ rc\;\n\ \ libvlc_media_t\ \ \ \ *m\;\n\ \ libvlc_event_manager_t\ \ \ \ *em\;\n\ \ vlcData_t\ \ \ \ \ \ \ \ \ *vlcData\ =\ (vlcData_t\ *)\ cd\;\n\ \ char\ \ \ \ \ \ \ \ \ \ \ \ \ \ *fn\;\n\ \ struct\ stat\ \ \ \ \ \ \ statinfo\;\n\n\ \ if\ (objc\ !=\ 2)\ \{\n\ \ \ \ Tcl_WrongNumArgs(interp,\ 1,\ objv,\ \"mediapath\")\;\n\ \ \ \ return\ TCL_ERROR\;\n\ \ \}\n\n\ \ rc\ =\ TCL_OK\;\n\ \ if\ (vlcData->inst\ ==\ NULL\ ||\ vlcData->mp\ ==\ NULL)\ \{\n\ \ \ \ rc\ =\ TCL_ERROR\;\n\ \ \}\ else\ \{\n\ \ \ \ fn\ =\ Tcl_GetString(objv\[1\])\;\n\ \ \ \ if\ (stat\ (fn,\ &statinfo)\ !=\ 0)\ \{\n\ \ \ \ \ \ rc\ =\ TCL_ERROR\;\n\ \ \ \ \ \ return\ rc\;\n\ \ \ \ \}\n\ \ \ \ m\ =\ libvlc_media_new_path\ (vlcData->inst,\ fn)\;\n\ \ \ \ libvlc_media_player_set_rate\ (vlcData->mp,\ 1.0)\;\n\ \ \ \ em\ =\ libvlc_media_event_manager\ (m)\;\n\ \ \ \ libvlc_event_attach\ (em,\ libvlc_MediaStateChanged,\n\ \ \ \ \ \ \ \ &vlcEventHandler,\ vlcData)\;\n\ \ \ \ libvlc_media_player_set_media\ (vlcData->mp,\ m)\;\n\ \ \ \ libvlc_media_release\ (m)\;\n\ \ \}\n\ \ return\ rc\;\n\}\n\nint\nvlcPauseCmd\ (\n\ \ ClientData\ cd,\n\ \ Tcl_Interp*\ interp,\n\ \ int\ objc,\n\ \ Tcl_Obj\ *\ const\ objv\[\]\n\ \ )\n\{\n\ \ int\ \ \ rc\;\n\ \ vlcData_t\ \ \ \ \ *vlcData\ =\ (vlcData_t\ *)\ cd\;\n\n\ \ if\ (objc\ !=\ 1)\ \{\n\ \ \ \ Tcl_WrongNumArgs(interp,\ 1,\ objv,\ \"\")\;\n\ \ \ \ return\ TCL_ERROR\;\n\ \ \}\n\n\ \ rc\ =\ TCL_OK\;\n\ \ if\ (vlcData->inst\ ==\ NULL\ ||\ vlcData->mp\ ==\ NULL)\ \{\n\ \ \ \ rc\ =\ TCL_ERROR\;\n\ \ \}\ else\ \{\n\ \ \ \ if\ (vlcData->state\ ==\ libvlc_Opening\ ||\n\ \ \ \ \ \ \ \ vlcData->state\ ==\ libvlc_Buffering)\ \{\n\ \ \ \ \ \ \;\n\ \ \ \ \}\ else\ if\ (vlcData->state\ ==\ libvlc_Playing)\ \{\n\ \ \ \ \ \ libvlc_media_player_set_pause\ (vlcData->mp,\ 1)\;\n\ \ \ \ \}\ else\ if\ (vlcData->state\ ==\ libvlc_Paused)\ \{\n\ \ \ \ \ \ libvlc_media_player_set_pause\ (vlcData->mp,\ 0)\;\n\ \ \ \ \}\n\ \ \}\n\ \ return\ rc\;\n\}\n\nint\nvlcPlayCmd\ (\n\ \ ClientData\ cd,\n\ \ Tcl_Interp*\ interp,\n\ \ int\ objc,\n\ \ Tcl_Obj\ *\ const\ objv\[\]\n\ \ )\n\{\n\ \ int\ \ \ rc\;\n\ \ vlcData_t\ \ \ \ \ *vlcData\ =\ (vlcData_t\ *)\ cd\;\n\n\ \ if\ (objc\ !=\ 1)\ \{\n\ \ \ \ Tcl_WrongNumArgs(interp,\ 1,\ objv,\ \"\")\;\n\ \ \ \ return\ TCL_ERROR\;\n\ \ \}\n\n\ \ rc\ =\ TCL_OK\;\n\ \ if\ (vlcData->inst\ ==\ NULL\ ||\ vlcData->mp\ ==\ NULL)\ \{\n\ \ \ \ rc\ =\ TCL_ERROR\;\n\ \ \}\ else\ \{\n\ \ \ \ libvlc_media_player_play\ (vlcData->mp)\;\n\ \ \}\n\ \ return\ rc\;\n\}\n\nint\nvlcRateCmd\ (\n\ \ ClientData\ cd,\n\ \ Tcl_Interp*\ interp,\n\ \ int\ objc,\n\ \ Tcl_Obj\ *\ const\ objv\[\]\n\ \ )\n\{\n\ \ int\ \ \ \ \ \ \ rc\;\n\ \ vlcData_t\ *vlcData\ =\ (vlcData_t\ *)\ cd\;\n\ \ float\ \ \ \ \ rate\;\n\ \ double\ \ \ \ d\;\n\n\n\ \ if\ (objc\ !=\ 1\ &&\ objc\ !=\ 2)\ \{\n\ \ \ \ Tcl_WrongNumArgs(interp,\ 1,\ objv,\ \"?rate?\")\;\n\ \ \ \ return\ TCL_ERROR\;\n\ \ \}\n\n\ \ rc\ =\ TCL_OK\;\n\ \ if\ (vlcData->inst\ ==\ NULL\ ||\ vlcData->mp\ ==\ NULL)\ \{\n\ \ \ \ rc\ =\ TCL_ERROR\;\n\ \ \}\ else\ \{\n\ \ \ \ if\ (objc\ ==\ 2\ &&\ vlcData->state\ ==\ libvlc_Playing)\ \{\n\ \ \ \ \ \ rc\ =\ Tcl_GetDoubleFromObj\ (interp,\ objv\[1\],\ &d)\;\n\ \ \ \ \ \ if\ (rc\ ==\ TCL_OK)\ \{\n\ \ \ \ \ \ \ \ rate\ =\ (float)\ d\;\n\ \ \ \ \ \ \ \ libvlc_media_player_set_rate\ (vlcData->mp,\ rate)\;\n\ \ \ \ \ \ \}\n\ \ \ \ \}\n\n\ \ \ \ rate\ =\ libvlc_media_player_get_rate\ (vlcData->mp)\;\n\ \ \ \ Tcl_SetObjResult\ (interp,\ Tcl_NewDoubleObj\ ((double)\ rate))\;\n\ \ \}\n\ \ return\ rc\;\n\}\n\nint\nvlcSeekCmd\ (\n\ \ ClientData\ cd,\n\ \ Tcl_Interp*\ interp,\n\ \ int\ objc,\n\ \ Tcl_Obj\ *\ const\ objv\[\]\n\ \ )\n\{\n\ \ int\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ rc\;\n\ \ libvlc_time_t\ \ \ \ \ tm\;\n\ \ double\ \ \ \ \ \ \ \ \ \ \ \ dtm\;\n\ \ vlcData_t\ \ \ \ \ \ \ \ \ *vlcData\ =\ (vlcData_t\ *)\ cd\;\n\ \ float\ \ \ \ \ \ \ \ \ \ \ \ \ pos\;\n\ \ double\ \ \ \ \ \ \ \ \ \ \ \ d\;\n\n\n\ \ if\ (objc\ !=\ 1\ &&\ objc\ !=\ 2)\ \{\n\ \ \ \ Tcl_WrongNumArgs(interp,\ 1,\ objv,\ \"?position?\")\;\n\ \ \ \ return\ TCL_ERROR\;\n\ \ \}\n\n\ \ rc\ =\ TCL_OK\;\n\ \ if\ (vlcData->inst\ ==\ NULL\ ||\ vlcData->mp\ ==\ NULL)\ \{\n\ \ \ \ rc\ =\ TCL_ERROR\;\n\ \ \}\ else\ \{\n\ \ \ \ if\ (objc\ ==\ 2\ &&\ vlcData->state\ ==\ libvlc_Playing)\ \{\n\ \ \ \ \ \ tm\ =\ libvlc_media_player_get_length\ (vlcData->mp)\;\n\ \ \ \ \ \ dtm\ =\ (double)\ tm\ /\ 1000.0\;\n\ \ \ \ \ \ rc\ =\ Tcl_GetDoubleFromObj\ (interp,\ objv\[1\],\ &d)\;\n\ \ \ \ \ \ d\ =\ d\ /\ dtm\;\n\ \ \ \ \ \ if\ (rc\ ==\ TCL_OK)\ \{\n\ \ \ \ \ \ \ \ pos\ =\ (float)\ d\;\n\ \ \ \ \ \ \ \ libvlc_media_player_set_position\ (vlcData->mp,\ pos)\;\n\ \ \ \ \ \ \}\n\ \ \ \ \}\n\ \ \ \ pos\ =\ libvlc_media_player_get_position\ (vlcData->mp)\;\n\ \ \ \ Tcl_SetObjResult\ (interp,\ Tcl_NewDoubleObj\ ((double)\ pos))\;\n\ \ \}\n\ \ return\ rc\;\n\}\n\nint\nvlcStateCmd\ (\n\ \ ClientData\ cd,\n\ \ Tcl_Interp*\ interp,\n\ \ int\ objc,\n\ \ Tcl_Obj\ *\ const\ objv\[\]\n\ \ )\n\{\n\ \ int\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ rc\;\n\ \ libvlc_state_t\ \ \ \ plstate\;\n\ \ vlcData_t\ \ \ \ \ \ \ \ \ *vlcData\ =\ (vlcData_t\ *)\ cd\;\n\n\ \ rc\ =\ TCL_OK\;\n\ \ if\ (vlcData->inst\ ==\ NULL\ ||\ vlcData->mp\ ==\ NULL)\ \{\n\ \ \ \ rc\ =\ TCL_ERROR\;\n\ \ \}\ else\ \{\n\ \ \ \ plstate\ =\ vlcData->state\;\n\ \ \ \ Tcl_SetObjResult\ (interp,\ Tcl_NewStringObj\ (stateToStr(plstate),\ -1))\;\n\ \ \}\n\ \ return\ rc\;\n\}\n\nint\nvlcStopCmd\ (\n\ \ ClientData\ cd,\n\ \ Tcl_Interp*\ interp,\n\ \ int\ objc,\n\ \ Tcl_Obj\ *\ const\ objv\[\]\n\ \ )\n\{\n\ \ int\ \ \ rc\;\n\ \ vlcData_t\ \ \ \ \ *vlcData\ =\ (vlcData_t\ *)\ cd\;\n\n\ \ rc\ =\ TCL_OK\;\n\ \ if\ (vlcData->inst\ ==\ NULL\ ||\ vlcData->mp\ ==\ NULL)\ \{\n\ \ \ \ rc\ =\ TCL_ERROR\;\n\ \ \}\ else\ \{\n\ \ \ \ libvlc_media_player_stop\ (vlcData->mp)\;\n\ \ \}\n\ \ return\ rc\;\n\}\n\nint\nvlcVersionCmd\ (\n\ \ ClientData\ cd,\n\ \ Tcl_Interp*\ interp,\n\ \ int\ objc,\n\ \ Tcl_Obj\ *\ const\ objv\[\]\n\ \ )\n\{\n\ \ vlcData_t\ \ \ \ \ *vlcData\ =\ (vlcData_t\ *)\ cd\;\n\n\ \ Tcl_SetObjResult\ (interp,\ Tcl_NewStringObj\ (vlcData->version,\ -1))\;\n\ \ return\ TCL_OK\;\n\}\n\nvoid\nvlcClose\ (\n\ \ vlcData_t\ \ \ \ \ *vlcData\n\ \ )\n\{\n\ \ int\ \ \ i\;\n\n\ \ if\ (vlcData->mp\ !=\ NULL)\ \{\n\ \ \ \ libvlc_media_player_stop\ (vlcData->mp)\;\n\ \ \ \ libvlc_media_player_release\ (vlcData->mp)\;\n\ \ \ \ vlcData->mp\ =\ NULL\;\n\ \ \}\n\ \ if\ (vlcData->inst\ !=\ NULL)\ \{\n\ \ \ \ libvlc_release\ (vlcData->inst)\;\n\ \ \ \ vlcData->inst\ =\ NULL\;\n\ \ \}\n\ \ if\ (vlcData->argv\ !=\ NULL)\ \{\n\ \ \ \ for\ (i\ =\ 0\;\ i\ <\ vlcData->argc\;\ ++i)\ \{\n\ \ \ \ \ \ ckfree\ (vlcData->argv\[i\])\;\n\ \ \ \ \}\n\ \ \ \ ckfree\ (vlcData->argv)\;\n\ \ \ \ vlcData->argv\ =\ NULL\;\n\ \ \}\n\n\ \ vlcData->state\ =\ libvlc_NothingSpecial\;\n\}\n\nvoid\nvlcExitHandler\ (\n\ \ void\ *cd\n\ \ )\n\{\n\ \ vlcData_t\ \ \ \ \ *vlcData\ =\ (vlcData_t\ *)\ cd\;\n\n\ \ vlcClose\ (vlcData)\;\n\ \ ckfree\ (cd)\;\n\}\n\nint\nvlcReleaseCmd\ (\n\ \ ClientData\ cd,\n\ \ Tcl_Interp*\ interp,\n\ \ int\ objc,\n\ \ Tcl_Obj\ *\ const\ objv\[\]\n\ \ )\n\{\n\ \ vlcData_t\ \ \ \ \ *vlcData\ =\ (vlcData_t\ *)\ cd\;\n\n\ \ vlcClose\ (vlcData)\;\n\ \ return\ TCL_OK\;\n\}\n\nint\nvlcInitCmd\ (\n\ \ ClientData\ cd,\n\ \ Tcl_Interp*\ interp,\n\ \ int\ objc,\n\ \ Tcl_Obj\ *\ const\ objv\[\]\n\ \ )\n\{\n\ \ char\ \ \ \ \ \ \ \ \ \ *tptr\;\n\ \ char\ \ \ \ \ \ \ \ \ \ *nptr\;\n\ \ int\ \ \ \ \ \ \ \ \ \ \ rc\;\n\ \ int\ \ \ \ \ \ \ \ \ \ \ i\;\n\ \ int\ \ \ \ \ \ \ \ \ \ \ len\;\n\ \ vlcData_t\ \ \ \ \ *vlcData\ =\ (vlcData_t\ *)\ cd\;\n\n\ \ vlcData->argv\ =\ (const\ char\ **)\ ckalloc\ (sizeof(const\ char\ *)\ *\ (size_t)\ (objc\ +\ 1))\;\n\ \ for\ (i\ =\ 0\;\ i\ <\ objc\;\ ++i)\ \{\n\ \ \ \ tptr\ =\ Tcl_GetStringFromObj\ (objv\[i\],\ &len)\;\n\ \ \ \ nptr\ =\ (char\ *)\ ckalloc\ (len+1)\;\n\ \ \ \ strcpy\ (nptr,\ tptr)\;\n\ \ \ \ vlcData->argv\[i\]\ =\ nptr\;\n\ \ \}\n\ \ vlcData->argc\ =\ objc\;\n\ \ vlcData->argv\[objc\]\ =\ NULL\;\n\n\ \ rc\ =\ TCL_ERROR\;\n\n\ \ strcpy\ (vlcData->version,\ libvlc_get_version\ ())\;\n\ \ tptr\ =\ strchr\ (vlcData->version,\ '\ ')\;\n\ \ if\ (tptr\ !=\ NULL)\ \{\n\ \ \ \ *tptr\ =\ '\\0'\;\n\ \ \}\n\n\ \ if\ (vlcData->inst\ ==\ NULL)\ \{\n\ \ \ \ vlcData->inst\ =\ libvlc_new\ (objc,\ vlcData->argv)\;\n\ \ \}\n\ \ if\ (vlcData->inst\ !=\ NULL\ &&\ vlcData->mp\ ==\ NULL)\ \{\n\ \ \ \ vlcData->mp\ =\ libvlc_media_player_new\ (vlcData->inst)\;\n\ \ \}\n\ \ if\ (vlcData->inst\ !=\ NULL\ &&\ vlcData->mp\ !=\ NULL)\ \{\n\ \ \ \ rc\ =\ TCL_OK\;\n\ \ \ \ libvlc_audio_set_volume\ (vlcData->mp,\ 100)\;\n\ \ \ \ Tcl_CreateExitHandler\ (vlcExitHandler,\ cd)\;\n\ \ \}\n\n\ \ return\ rc\;\n\}\n\nstatic\ const\ EnsembleData\ vlcCmdMap\[\]\ =\ \{\n\ \ \{\ \"close\",\ \ \ \ \ \ vlcReleaseCmd\ \},\n\ \ \{\ \"duration\",\ \ \ vlcDurationCmd\ \},\n\ \ \{\ \"gettime\",\ \ \ \ vlcGetTimeCmd\ \},\n\ \ \{\ \"init\",\ \ \ \ \ \ \ vlcInitCmd\ \},\n\ \ \{\ \"isplay\",\ \ \ \ \ vlcIsPlayCmd\ \},\n\ \ \{\ \"media\",\ \ \ \ \ \ vlcMediaCmd\ \},\n\ \ \{\ \"pause\",\ \ \ \ \ \ vlcPauseCmd\ \},\n\ \ \{\ \"play\",\ \ \ \ \ \ \ vlcPlayCmd\ \},\n\ \ \{\ \"rate\",\ \ \ \ \ \ \ vlcRateCmd\ \},\n\ \ \{\ \"seek\",\ \ \ \ \ \ \ vlcSeekCmd\ \},\n\ \ \{\ \"state\",\ \ \ \ \ \ vlcStateCmd\ \},\n\ \ \{\ \"stop\",\ \ \ \ \ \ \ vlcStopCmd\ \},\n\ \ \{\ \"version\",\ \ \ \ vlcVersionCmd\ \},\n\ \ \{\ NULL,\ NULL\ \}\n\}\;\n\nint\nTclvlc_Init\ (Tcl_Interp\ *interp)\n\{\n\ \ Tcl_Namespace\ *nsPtr\ =\ NULL\;\n\ \ Tcl_Command\ \ \ ensemble\ =\ NULL\;\n\ \ Tcl_Obj\ \ \ \ \ \ \ *dictObj\ =\ NULL\;\n\ \ Tcl_DString\ \ \ ds\;\n\ \ vlcData_t\ \ \ \ \ *vlcData\;\n\ \ int\ \ \ \ \ \ \ \ \ \ \ i\;\n\ \ int\ \ \ \ \ \ \ \ \ \ \ rc\;\n\ \ const\ char\ \ \ \ *nsName\ =\ \"::tcl::tclvlc\"\;\n\ \ const\ char\ \ \ \ *cmdName\ =\ nsName\ +\ 5\;\n\n#ifdef\ USE_TCL_STUBS\n\ \ if\ (!Tcl_InitStubs\ (interp,\"8.3\",0))\ \{\n\ \ \ \ return\ TCL_ERROR\;\n\ \ \}\n#else\n\ \ if\ (!Tcl_PkgRequire\ (interp,\"Tcl\",\"8.3\",0))\ \{\n\ \ \ \ return\ TCL_ERROR\;\n\ \ \}\n#endif\n\n\ \ vlcData\ =\ (vlcData_t\ *)\ ckalloc\ (sizeof\ (vlcData_t))\;\n\ \ vlcData->interp\ =\ interp\;\n\ \ vlcData->inst\ =\ NULL\;\n\ \ vlcData->mp\ =\ NULL\;\n\ \ vlcData->argv\ =\ NULL\;\n\ \ vlcData->state\ =\ libvlc_NothingSpecial\;\n\n\ \ nsPtr\ =\ Tcl_FindNamespace(interp,\ nsName,\ NULL,\ 0)\;\n\ \ if\ (nsPtr\ ==\ NULL)\ \{\n\ \ \ \ nsPtr\ =\ Tcl_CreateNamespace(interp,\ nsName,\ NULL,\ 0)\;\n\ \ \ \ if\ (nsPtr\ ==\ NULL)\ \{\n\ \ \ \ \ \ Tcl_Panic\ (\"failed\ to\ create\ namespace:\ %s\\n\",\ nsName)\;\n\ \ \ \ \}\n\ \ \}\n\n\ \ ensemble\ =\ Tcl_CreateEnsemble(interp,\ cmdName,\ nsPtr,\ TCL_ENSEMBLE_PREFIX)\;\n\ \ if\ (ensemble\ ==\ NULL)\ \{\n\ \ \ \ Tcl_Panic\ (\"failed\ to\ create\ ensemble:\ %s\\n\",\ cmdName)\;\n\ \ \}\n\ \ Tcl_DStringInit\ (&ds)\;\n\ \ Tcl_DStringAppend\ (&ds,\ nsName,\ -1)\;\n\n\ \ dictObj\ =\ Tcl_NewObj()\;\n\ \ for\ (i\ =\ 0\;\ vlcCmdMap\[i\].name\ !=\ NULL\;\ ++i)\ \{\n\ \ \ \ Tcl_Obj\ *nameObj\;\n\ \ \ \ Tcl_Obj\ *fqdnObj\;\n\n\ \ \ \ nameObj\ =\ Tcl_NewStringObj\ (vlcCmdMap\[i\].name,\ -1)\;\n\ \ \ \ fqdnObj\ =\ Tcl_NewStringObj\ (Tcl_DStringValue(&ds),\ Tcl_DStringLength(&ds))\;\n\ \ \ \ Tcl_AppendStringsToObj\ (fqdnObj,\ \"::\",\ vlcCmdMap\[i\].name,\ NULL)\;\n\ \ \ \ Tcl_DictObjPut\ (NULL,\ dictObj,\ nameObj,\ fqdnObj)\;\n\ \ \ \ if\ (vlcCmdMap\[i\].proc)\ \{\n\ \ \ \ \ \ Tcl_CreateObjCommand\ (interp,\ Tcl_GetString\ (fqdnObj),\n\ \ \ \ \ \ \ \ \ \ \ vlcCmdMap\[i\].proc,\ (ClientData)\ vlcData,\ NULL)\;\n\ \ \ \ \}\n\ \ \}\n\n\ \ if\ (ensemble)\ \{\n\ \ \ \ Tcl_SetEnsembleMappingDict\ (interp,\ ensemble,\ dictObj)\;\n\ \ \}\n\n\ \ Tcl_DStringFree(&ds)\;\n\n\ \ Tcl_PkgProvide\ (interp,\ cmdName+2,\ \"0.1\")\;\n\ \ return\ TCL_OK\;\n\}\n=====\n\n'''mkvlc.sh'''\n======\n#!/bin/sh\n\ntv=8.6\nslext=.so\nos=`uname\ -s`\narch=`uname\ -m`\nbits=64\ncase\ \$arch\ in\n\ \ i?86*)\n\ \ \ \ bits=32\n\ \ \ \ \;\;\nesac\ninc=-I/usr/include/tcl\$\{tv\}\nlib=\nlv=\$tv\nif\ \[\ \$os\ =\ \"Darwin\"\ \]\;\ then\n\ \ slext=.dylib\n\ \ #\ for\ MacPorts\ tcl\n\ \ inc=-I/opt/local/include\n\ \ lib=-L/opt/local/lib\n\ \ inc+=\"\ -I/Applications/VLC.app/Contents/MacOS/include\"\n\ \ lib+=\"\ -L/Applications/VLC.app/Contents/MacOS/lib\"\nfi\n\n\$\{CC:-cc\}\ -O\ -shared\ -fPIC\ -o\ tclvlc\$\{slext\}\ \$inc\ -DUSE_TCL_STUBS\ tclvlc.c\ \$lib\ -ltclstub\$\{lv\}\ -lvlc\ntest\ -d\ \$os\ ||\ mkdir\ \$os\nif\ \[\ -f\ tclvlc\$\{slext\}\ \]\;\ then\n\ \ echo\ \"tclvlc\ success\"\n\ \ mv\ -f\ tclvlc\$\{slext\}\ \$os/tclvlc\$\{bits\}\$\{slext\}\nfi\nif\ \[\ \$os\ =\ \"Darwin\"\ \]\;\ then\n\ \ install_name_tool\ -change\ \"@loader_path/lib/libvlc.5.dylib\"\ \"/Applications/VLC.app/Contents/MacOS/lib/libvlc.5.dylib\"\ Darwin/*\nfi\n======\n\n'''winmkvlc.sh'''\n======\n#!/bin/bash\n\ntest\ -d\ Windows\ ||\ mkdir\ Windows\n\ncase\ \$MSYSTEM\ in\n\ \ *32)\n\ \ \ \ gcc\ -m32\ -shared\ -static-libgcc\ -DWIN_TCL_INTERFACE\ -o\ Windows/tclvlc32.dll\ \\\n\ \ \ \ \ \ \ \ -I'/home/bll/vlc/vlc-2.2.4/include'\ \\\n\ \ \ \ \ \ \ \ '-Wl,-rpath=/c/Program\ Files\ (x86)/VideoLAN/vlc'\ \\\n\ \ \ \ \ \ \ \ -I\$HOME/local-32/include\ -DUSE_TCL_STUBS\ tclvlc.c\ \\\n\ \ \ \ \ \ \ \ -L\$HOME/local-32/lib\ -ltclstub86\ \\\n\ \ \ \ \ \ \ \ -L'/c/Program\ Files\ (x86)/VideoLAN/vlc'\ -lvlc\n\ \ \ \ \;\;\n\ \ *64)\n\ \ \ \ gcc\ -m64\ -shared\ -static-libgcc\ -DWIN_TCL_INTERFACE\ -o\ Windows/tclvlc64.dll\ \\\n\ \ \ \ \ \ \ \ -I'/home/bll/vlc/vlc-2.2.4/include'\ \\\n\ \ \ \ \ \ \ \ '-Wl,-rpath=/c/Program\ Files/VideoLAN/vlc'\ \\\n\ \ \ \ \ \ \ \ -I\$HOME/local-64/include\ -DUSE_TCL_STUBS\ tclvlc.c\ \\\n\ \ \ \ \ \ \ \ -L\$HOME/local-64/lib\ -ltclstub86\ \\\n\ \ \ \ \ \ \ \ -L'/c/Program\ Files/VideoLAN/vlc'\ -lvlc\n\ \ \ \ \;\;\nesac\n======\n\n<<categories>>Package\ |\ Multimedia regexp2} CALL {my render {VLC Tcl Extension} **VLC\ Tcl\ Extension**\n\n\[bll\]\ 2016-12-28\ :\ One\ full\ day's\ work.\ \ This\ is\ a\ Tcl\ interface\ to\ libvlc,\ which\ comes\ with\ the\ VLC\ media\ player.\ \ The\ tighter\ interface\ gives\ better\ control\ over\ song\ position,\ time\ position\ and\ player\ state.\n\nI\ only\ need\ audio,\ and\ don't\ use\ playlists.\ \ The\ media\ sub-command\ only\ handles\ file\ paths\ right\ now.\ There's\ quite\ a\ bit\ that\ could\ still\ be\ implemented.\ \ But\ most\ of\ that\ implementation\ would\ be\ fairly\ straightforward.\n\nI\ have\ given\ up\ trying\ to\ get\ callbacks\ working.\ \ Calling\ Tcl\ code\ from\ the\ VLC\ event\ handler\ does\ not\ seem\ to\ work\ properly\ on\ Windows.\n\n'''test.tcl'''\n======\n#!/usr/bin/tclsh\n\nset\ os\ \$::tcl_platform(os)\nif\ \{\ \[regexp\ -nocase\ \{^win\}\ \$os\]\ \}\ \{\n\ \ set\ os\ Windows\n\}\n\nload\ \[pwd\]/\$os/tclvlc64\[info\ sharedlibextension\]\ntclvlc\ init\ --intf\ dummy\ --no-video\ --ignore-config\ \\\n\ \ \ \ --no-media-library\ --no-playlist-autostart\ \\\n\ \ \ \ --no-loop\ --no-random\ --no-repeat\ --quiet\ --play-and-stop\ \\\n\ \ \ \ --audio-filter\ scaletempo\n\nif\ \{\ \$os\ eq\ \"Linux\"\ \}\ \{\n\ \ tclvlc\ media\ /home/bll/sources/ballroomdj/test.dir/test-files/counter.mp3\n\}\nif\ \{\ \$os\ eq\ \"Darwin\"\ \}\ \{\n\ \ tclvlc\ media\ /Users/bll/Desktop/BallroomDJ.app/Contents/MacOS/test.dir/test-files/counter.mp3\n\}\nif\ \{\ \$os\ eq\ \"Windows\"\ \}\ \{\n\ \ tclvlc\ media\ \[file\ nativename\ \{C:/Users/bll/Desktop/BallroomDJ/test.dir/test-files/counter.mp3\}\]\n\}\n\ntclvlc\ play\nset\ state\ \[tclvlc\ state\]\nwhile\ \{\ \$state\ eq\ \"opening\"\ ||\ \$state\ eq\ \"buffering\"\ \}\ \{\n\ \ after\ 100\n\ \ set\ state\ \[tclvlc\ state\]\n\}\ntclvlc\ seek\ 0.0387\nset\ ::x\ 0\nafter\ 1000\ set\ ::x\ 1\nvwait\ ::x\ntclvlc\ close\nexit\n======\n\n'''tclvlc.c'''\n======\n/*\n\ *\ Copyright\ 2016-2017\ Brad\ Lanam\ Walnut\ Creek\ CA\ US\n\ *\ MIT\ License\n\ */\n\n#include\ <stdio.h>\n#include\ <stdlib.h>\n#include\ <string.h>\n#include\ <sys/stat.h>\n#include\ <sys/types.h>\n#include\ <tcl.h>\n#include\ <vlc/vlc.h>\n\ntypedef\ struct\ \{\ char\ *name\;\ Tcl_ObjCmdProc\ *proc\;\ \}\ EnsembleData\;\n\ntypedef\ struct\ \{\n\ \ libvlc_state_t\ \ \ \ \ \ \ \ state\;\n\ \ const\ char\ *\ \ \ \ \ \ \ \ \ \ name\;\n\}\ stateMap_t\;\n\nstatic\ const\ stateMap_t\ stateMap\[\]\ =\ \{\n\ \ \{\ libvlc_NothingSpecial,\ \ \"idle\"\ \},\n\ \ \{\ libvlc_Opening,\ \ \ \ \ \ \ \ \ \"opening\"\ \},\n\ \ \{\ libvlc_Buffering,\ \ \ \ \ \ \ \"buffering\"\ \},\n\ \ \{\ libvlc_Playing,\ \ \ \ \ \ \ \ \ \"playing\"\ \},\n\ \ \{\ libvlc_Paused,\ \ \ \ \ \ \ \ \ \ \"paused\"\ \},\n\ \ \{\ libvlc_Stopped,\ \ \ \ \ \ \ \ \ \"stopped\"\ \},\n\ \ \{\ libvlc_Ended,\ \ \ \ \ \ \ \ \ \ \ \"ended\"\ \},\n\ \ \{\ libvlc_Error,\ \ \ \ \ \ \ \ \ \ \ \"error\"\ \}\n\}\;\n#define\ stateMapMax\ (sizeof(stateMap)/sizeof(stateMap_t))\n\ntypedef\ struct\ \{\n\ \ Tcl_Interp\ \ \ \ \ \ \ \ \ \ \ \ *interp\;\n\ \ libvlc_instance_t\ \ \ \ \ *inst\;\n\ \ char\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ version\ \[40\]\;\n\ \ libvlc_media_player_t\ *mp\;\n\ \ libvlc_state_t\ \ \ \ \ \ \ \ state\;\n\ \ int\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ argc\;\n\ \ const\ char\ \ \ \ \ \ \ \ \ \ \ \ **argv\;\n\}\ vlcData_t\;\n\nconst\ char\ *\nstateToStr\ (\n\ \ libvlc_state_t\ \ \ \ state\n\ \ )\n\{\n\ \ int\ \ \ \ \ \ \ \ i\;\n\ \ const\ char\ *tptr\;\n\n\ \ tptr\ =\ \"\"\;\n\ \ for\ (i\ =\ 0\;\ i\ <\ stateMapMax\;\ ++i)\ \{\n\ \ \ \ if\ (state\ ==\ stateMap\[i\].state)\ \{\n\ \ \ \ \ \ tptr\ =\ stateMap\[i\].name\;\n\ \ \ \ \ \ break\;\n\ \ \ \ \}\n\ \ \}\n\ \ return\ tptr\;\n\}\n\nlibvlc_state_t\nstateToValue\ (\n\ \ char\ *name\n\ \ )\n\{\n\ \ int\ \ \ i\;\n\ \ libvlc_state_t\ state\;\n\n\ \ state\ =\ libvlc_NothingSpecial\;\n\ \ for\ (i\ =\ 0\;\ i\ <\ stateMapMax\;\ ++i)\ \{\n\ \ \ \ if\ (strcmp\ (name,\ stateMap\[i\].name)\ ==\ 0)\ \{\n\ \ \ \ \ \ state\ =\ stateMap\[i\].state\;\n\ \ \ \ \ \ break\;\n\ \ \ \ \}\n\ \ \}\n\ \ return\ state\;\n\}\n\nvoid\nvlcEventHandler\ (\n\ \ const\ struct\ libvlc_event_t\ *event,\n\ \ void\ *cd\n\ \ )\n\{\n\ \ vlcData_t\ \ \ \ \ *vlcData\ =\ (vlcData_t\ *)\ cd\;\n\ \ int\ \ \ \ \ \ \ \ \ \ \ objc\;\n\ \ Tcl_Obj\ \ \ \ \ \ \ **objv\;\n\ \ Tcl_Obj\ \ \ \ \ \ \ *tobj\;\n\n\ \ if\ (event->type\ ==\ libvlc_MediaStateChanged)\ \{\n\ \ \ \ vlcData->state\ =\ event->u.media_state_changed.new_state\;\n\ \ \}\n\}\n\nint\nvlcDurationCmd\ (\n\ \ ClientData\ cd,\n\ \ Tcl_Interp*\ interp,\n\ \ int\ objc,\n\ \ Tcl_Obj\ *\ const\ objv\[\]\n\ \ )\n\{\n\ \ int\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ rc\;\n\ \ libvlc_time_t\ \ \ \ \ tm\;\n\ \ double\ \ \ \ \ \ \ \ \ \ \ \ dtm\;\n\ \ vlcData_t\ *vlcData\ =\ (vlcData_t\ *)\ cd\;\n\n\ \ if\ (objc\ !=\ 1)\ \{\n\ \ \ \ Tcl_WrongNumArgs(interp,\ 1,\ objv,\ \"\")\;\n\ \ \ \ return\ TCL_ERROR\;\n\ \ \}\n\n\ \ rc\ =\ TCL_OK\;\n\ \ if\ (vlcData->inst\ ==\ NULL\ ||\ vlcData->mp\ ==\ NULL)\ \{\n\ \ \ \ rc\ =\ TCL_ERROR\;\n\ \ \}\ else\ \{\n\ \ \ \ tm\ =\ libvlc_media_player_get_length\ (vlcData->mp)\;\n\ \ \ \ dtm\ =\ (double)\ tm\ /\ 1000.0\;\n\ \ \ \ Tcl_SetObjResult\ (interp,\ Tcl_NewDoubleObj\ (dtm))\;\n\ \ \}\n\ \ return\ rc\;\n\}\n\nint\nvlcGetTimeCmd\ (\n\ \ ClientData\ cd,\n\ \ Tcl_Interp*\ interp,\n\ \ int\ objc,\n\ \ Tcl_Obj\ *\ const\ objv\[\]\n\ \ )\n\{\n\ \ int\ \ \ \ \ \ \ rc\;\n\ \ libvlc_time_t\ \ \ \ \ tm\;\n\ \ double\ \ \ \ \ \ \ \ \ \ \ \ dtm\;\n\ \ vlcData_t\ *vlcData\ =\ (vlcData_t\ *)\ cd\;\n\n\ \ if\ (objc\ !=\ 1)\ \{\n\ \ \ \ Tcl_WrongNumArgs(interp,\ 1,\ objv,\ \"\")\;\n\ \ \ \ return\ TCL_ERROR\;\n\ \ \}\n\n\ \ rc\ =\ TCL_OK\;\n\ \ if\ (vlcData->inst\ ==\ NULL\ ||\ vlcData->mp\ ==\ NULL)\ \{\n\ \ \ \ rc\ =\ TCL_ERROR\;\n\ \ \}\ else\ \{\n\ \ \ \ tm\ =\ libvlc_media_player_get_time\ (vlcData->mp)\;\n\ \ \ \ dtm\ =\ (double)\ tm\ /\ 1000.0\;\n\ \ \ \ Tcl_SetObjResult\ (interp,\ Tcl_NewDoubleObj\ (dtm))\;\n\ \ \}\n\ \ return\ rc\;\n\}\n\nint\nvlcIsPlayCmd\ (\n\ \ ClientData\ cd,\n\ \ Tcl_Interp*\ interp,\n\ \ int\ objc,\n\ \ Tcl_Obj\ *\ const\ objv\[\]\n\ \ )\n\{\n\ \ int\ \ \ \ \ \ \ rc\;\n\ \ int\ \ \ \ \ \ \ rval\;\n\ \ vlcData_t\ *vlcData\ =\ (vlcData_t\ *)\ cd\;\n\n\ \ if\ (objc\ !=\ 1)\ \{\n\ \ \ \ Tcl_WrongNumArgs(interp,\ 1,\ objv,\ \"\")\;\n\ \ \ \ return\ TCL_ERROR\;\n\ \ \}\n\n\ \ rc\ =\ TCL_OK\;\n\ \ rval\ =\ 0\;\n\ \ if\ (vlcData->inst\ ==\ NULL\ ||\ vlcData->mp\ ==\ NULL)\ \{\n\ \ \ \ rc\ =\ TCL_ERROR\;\n\ \ \}\ else\ \{\n\ \ \ \ /*\n\ \ \ \ \ *\ In\ order\ to\ match\ the\ implementation\ of\ VLC's\ internal\n\ \ \ \ \ *\ isplaying\ command,\ return\ true\ if\ the\ player\ is\ paused\n\ \ \ \ \ */\n\ \ \ \ if\ (vlcData->state\ ==\ libvlc_Opening\ ||\n\ \ \ \ \ \ \ \ vlcData->state\ ==\ libvlc_Buffering\ ||\n\ \ \ \ \ \ \ \ vlcData->state\ ==\ libvlc_Playing\ ||\n\ \ \ \ \ \ \ \ vlcData->state\ ==\ libvlc_Paused)\ \{\n\ \ \ \ \ \ rval\ =\ 1\;\n\ \ \ \ \}\n\ \ \ \ Tcl_SetObjResult\ (interp,\ Tcl_NewIntObj\ (rval))\;\n\ \ \}\n\ \ return\ rc\;\n\}\n\nint\nvlcMediaCmd\ (\n\ \ ClientData\ cd,\n\ \ Tcl_Interp*\ interp,\n\ \ int\ objc,\n\ \ Tcl_Obj\ *\ const\ objv\[\]\n\ \ )\n\{\n\ \ int\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ rc\;\n\ \ libvlc_media_t\ \ \ \ *m\;\n\ \ libvlc_event_manager_t\ \ \ \ *em\;\n\ \ vlcData_t\ \ \ \ \ \ \ \ \ *vlcData\ =\ (vlcData_t\ *)\ cd\;\n\ \ char\ \ \ \ \ \ \ \ \ \ \ \ \ \ *fn\;\n\ \ struct\ stat\ \ \ \ \ \ \ statinfo\;\n\n\ \ if\ (objc\ !=\ 2)\ \{\n\ \ \ \ Tcl_WrongNumArgs(interp,\ 1,\ objv,\ \"mediapath\")\;\n\ \ \ \ return\ TCL_ERROR\;\n\ \ \}\n\n\ \ rc\ =\ TCL_OK\;\n\ \ if\ (vlcData->inst\ ==\ NULL\ ||\ vlcData->mp\ ==\ NULL)\ \{\n\ \ \ \ rc\ =\ TCL_ERROR\;\n\ \ \}\ else\ \{\n\ \ \ \ fn\ =\ Tcl_GetString(objv\[1\])\;\n\ \ \ \ if\ (stat\ (fn,\ &statinfo)\ !=\ 0)\ \{\n\ \ \ \ \ \ rc\ =\ TCL_ERROR\;\n\ \ \ \ \ \ return\ rc\;\n\ \ \ \ \}\n\ \ \ \ m\ =\ libvlc_media_new_path\ (vlcData->inst,\ fn)\;\n\ \ \ \ libvlc_media_player_set_rate\ (vlcData->mp,\ 1.0)\;\n\ \ \ \ em\ =\ libvlc_media_event_manager\ (m)\;\n\ \ \ \ libvlc_event_attach\ (em,\ libvlc_MediaStateChanged,\n\ \ \ \ \ \ \ \ &vlcEventHandler,\ vlcData)\;\n\ \ \ \ libvlc_media_player_set_media\ (vlcData->mp,\ m)\;\n\ \ \ \ libvlc_media_release\ (m)\;\n\ \ \}\n\ \ return\ rc\;\n\}\n\nint\nvlcPauseCmd\ (\n\ \ ClientData\ cd,\n\ \ Tcl_Interp*\ interp,\n\ \ int\ objc,\n\ \ Tcl_Obj\ *\ const\ objv\[\]\n\ \ )\n\{\n\ \ int\ \ \ rc\;\n\ \ vlcData_t\ \ \ \ \ *vlcData\ =\ (vlcData_t\ *)\ cd\;\n\n\ \ if\ (objc\ !=\ 1)\ \{\n\ \ \ \ Tcl_WrongNumArgs(interp,\ 1,\ objv,\ \"\")\;\n\ \ \ \ return\ TCL_ERROR\;\n\ \ \}\n\n\ \ rc\ =\ TCL_OK\;\n\ \ if\ (vlcData->inst\ ==\ NULL\ ||\ vlcData->mp\ ==\ NULL)\ \{\n\ \ \ \ rc\ =\ TCL_ERROR\;\n\ \ \}\ else\ \{\n\ \ \ \ if\ (vlcData->state\ ==\ libvlc_Opening\ ||\n\ \ \ \ \ \ \ \ vlcData->state\ ==\ libvlc_Buffering)\ \{\n\ \ \ \ \ \ \;\n\ \ \ \ \}\ else\ if\ (vlcData->state\ ==\ libvlc_Playing)\ \{\n\ \ \ \ \ \ libvlc_media_player_set_pause\ (vlcData->mp,\ 1)\;\n\ \ \ \ \}\ else\ if\ (vlcData->state\ ==\ libvlc_Paused)\ \{\n\ \ \ \ \ \ libvlc_media_player_set_pause\ (vlcData->mp,\ 0)\;\n\ \ \ \ \}\n\ \ \}\n\ \ return\ rc\;\n\}\n\nint\nvlcPlayCmd\ (\n\ \ ClientData\ cd,\n\ \ Tcl_Interp*\ interp,\n\ \ int\ objc,\n\ \ Tcl_Obj\ *\ const\ objv\[\]\n\ \ )\n\{\n\ \ int\ \ \ rc\;\n\ \ vlcData_t\ \ \ \ \ *vlcData\ =\ (vlcData_t\ *)\ cd\;\n\n\ \ if\ (objc\ !=\ 1)\ \{\n\ \ \ \ Tcl_WrongNumArgs(interp,\ 1,\ objv,\ \"\")\;\n\ \ \ \ return\ TCL_ERROR\;\n\ \ \}\n\n\ \ rc\ =\ TCL_OK\;\n\ \ if\ (vlcData->inst\ ==\ NULL\ ||\ vlcData->mp\ ==\ NULL)\ \{\n\ \ \ \ rc\ =\ TCL_ERROR\;\n\ \ \}\ else\ \{\n\ \ \ \ libvlc_media_player_play\ (vlcData->mp)\;\n\ \ \}\n\ \ return\ rc\;\n\}\n\nint\nvlcRateCmd\ (\n\ \ ClientData\ cd,\n\ \ Tcl_Interp*\ interp,\n\ \ int\ objc,\n\ \ Tcl_Obj\ *\ const\ objv\[\]\n\ \ )\n\{\n\ \ int\ \ \ \ \ \ \ rc\;\n\ \ vlcData_t\ *vlcData\ =\ (vlcData_t\ *)\ cd\;\n\ \ float\ \ \ \ \ rate\;\n\ \ double\ \ \ \ d\;\n\n\n\ \ if\ (objc\ !=\ 1\ &&\ objc\ !=\ 2)\ \{\n\ \ \ \ Tcl_WrongNumArgs(interp,\ 1,\ objv,\ \"?rate?\")\;\n\ \ \ \ return\ TCL_ERROR\;\n\ \ \}\n\n\ \ rc\ =\ TCL_OK\;\n\ \ if\ (vlcData->inst\ ==\ NULL\ ||\ vlcData->mp\ ==\ NULL)\ \{\n\ \ \ \ rc\ =\ TCL_ERROR\;\n\ \ \}\ else\ \{\n\ \ \ \ if\ (objc\ ==\ 2\ &&\ vlcData->state\ ==\ libvlc_Playing)\ \{\n\ \ \ \ \ \ rc\ =\ Tcl_GetDoubleFromObj\ (interp,\ objv\[1\],\ &d)\;\n\ \ \ \ \ \ if\ (rc\ ==\ TCL_OK)\ \{\n\ \ \ \ \ \ \ \ rate\ =\ (float)\ d\;\n\ \ \ \ \ \ \ \ libvlc_media_player_set_rate\ (vlcData->mp,\ rate)\;\n\ \ \ \ \ \ \}\n\ \ \ \ \}\n\n\ \ \ \ rate\ =\ libvlc_media_player_get_rate\ (vlcData->mp)\;\n\ \ \ \ Tcl_SetObjResult\ (interp,\ Tcl_NewDoubleObj\ ((double)\ rate))\;\n\ \ \}\n\ \ return\ rc\;\n\}\n\nint\nvlcSeekCmd\ (\n\ \ ClientData\ cd,\n\ \ Tcl_Interp*\ interp,\n\ \ int\ objc,\n\ \ Tcl_Obj\ *\ const\ objv\[\]\n\ \ )\n\{\n\ \ int\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ rc\;\n\ \ libvlc_time_t\ \ \ \ \ tm\;\n\ \ double\ \ \ \ \ \ \ \ \ \ \ \ dtm\;\n\ \ vlcData_t\ \ \ \ \ \ \ \ \ *vlcData\ =\ (vlcData_t\ *)\ cd\;\n\ \ float\ \ \ \ \ \ \ \ \ \ \ \ \ pos\;\n\ \ double\ \ \ \ \ \ \ \ \ \ \ \ d\;\n\n\n\ \ if\ (objc\ !=\ 1\ &&\ objc\ !=\ 2)\ \{\n\ \ \ \ Tcl_WrongNumArgs(interp,\ 1,\ objv,\ \"?position?\")\;\n\ \ \ \ return\ TCL_ERROR\;\n\ \ \}\n\n\ \ rc\ =\ TCL_OK\;\n\ \ if\ (vlcData->inst\ ==\ NULL\ ||\ vlcData->mp\ ==\ NULL)\ \{\n\ \ \ \ rc\ =\ TCL_ERROR\;\n\ \ \}\ else\ \{\n\ \ \ \ if\ (objc\ ==\ 2\ &&\ vlcData->state\ ==\ libvlc_Playing)\ \{\n\ \ \ \ \ \ tm\ =\ libvlc_media_player_get_length\ (vlcData->mp)\;\n\ \ \ \ \ \ dtm\ =\ (double)\ tm\ /\ 1000.0\;\n\ \ \ \ \ \ rc\ =\ Tcl_GetDoubleFromObj\ (interp,\ objv\[1\],\ &d)\;\n\ \ \ \ \ \ d\ =\ d\ /\ dtm\;\n\ \ \ \ \ \ if\ (rc\ ==\ TCL_OK)\ \{\n\ \ \ \ \ \ \ \ pos\ =\ (float)\ d\;\n\ \ \ \ \ \ \ \ libvlc_media_player_set_position\ (vlcData->mp,\ pos)\;\n\ \ \ \ \ \ \}\n\ \ \ \ \}\n\ \ \ \ pos\ =\ libvlc_media_player_get_position\ (vlcData->mp)\;\n\ \ \ \ Tcl_SetObjResult\ (interp,\ Tcl_NewDoubleObj\ ((double)\ pos))\;\n\ \ \}\n\ \ return\ rc\;\n\}\n\nint\nvlcStateCmd\ (\n\ \ ClientData\ cd,\n\ \ Tcl_Interp*\ interp,\n\ \ int\ objc,\n\ \ Tcl_Obj\ *\ const\ objv\[\]\n\ \ )\n\{\n\ \ int\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ rc\;\n\ \ libvlc_state_t\ \ \ \ plstate\;\n\ \ vlcData_t\ \ \ \ \ \ \ \ \ *vlcData\ =\ (vlcData_t\ *)\ cd\;\n\n\ \ rc\ =\ TCL_OK\;\n\ \ if\ (vlcData->inst\ ==\ NULL\ ||\ vlcData->mp\ ==\ NULL)\ \{\n\ \ \ \ rc\ =\ TCL_ERROR\;\n\ \ \}\ else\ \{\n\ \ \ \ plstate\ =\ vlcData->state\;\n\ \ \ \ Tcl_SetObjResult\ (interp,\ Tcl_NewStringObj\ (stateToStr(plstate),\ -1))\;\n\ \ \}\n\ \ return\ rc\;\n\}\n\nint\nvlcStopCmd\ (\n\ \ ClientData\ cd,\n\ \ Tcl_Interp*\ interp,\n\ \ int\ objc,\n\ \ Tcl_Obj\ *\ const\ objv\[\]\n\ \ )\n\{\n\ \ int\ \ \ rc\;\n\ \ vlcData_t\ \ \ \ \ *vlcData\ =\ (vlcData_t\ *)\ cd\;\n\n\ \ rc\ =\ TCL_OK\;\n\ \ if\ (vlcData->inst\ ==\ NULL\ ||\ vlcData->mp\ ==\ NULL)\ \{\n\ \ \ \ rc\ =\ TCL_ERROR\;\n\ \ \}\ else\ \{\n\ \ \ \ libvlc_media_player_stop\ (vlcData->mp)\;\n\ \ \}\n\ \ return\ rc\;\n\}\n\nint\nvlcVersionCmd\ (\n\ \ ClientData\ cd,\n\ \ Tcl_Interp*\ interp,\n\ \ int\ objc,\n\ \ Tcl_Obj\ *\ const\ objv\[\]\n\ \ )\n\{\n\ \ vlcData_t\ \ \ \ \ *vlcData\ =\ (vlcData_t\ *)\ cd\;\n\n\ \ Tcl_SetObjResult\ (interp,\ Tcl_NewStringObj\ (vlcData->version,\ -1))\;\n\ \ return\ TCL_OK\;\n\}\n\nvoid\nvlcClose\ (\n\ \ vlcData_t\ \ \ \ \ *vlcData\n\ \ )\n\{\n\ \ int\ \ \ i\;\n\n\ \ if\ (vlcData->mp\ !=\ NULL)\ \{\n\ \ \ \ libvlc_media_player_stop\ (vlcData->mp)\;\n\ \ \ \ libvlc_media_player_release\ (vlcData->mp)\;\n\ \ \ \ vlcData->mp\ =\ NULL\;\n\ \ \}\n\ \ if\ (vlcData->inst\ !=\ NULL)\ \{\n\ \ \ \ libvlc_release\ (vlcData->inst)\;\n\ \ \ \ vlcData->inst\ =\ NULL\;\n\ \ \}\n\ \ if\ (vlcData->argv\ !=\ NULL)\ \{\n\ \ \ \ for\ (i\ =\ 0\;\ i\ <\ vlcData->argc\;\ ++i)\ \{\n\ \ \ \ \ \ ckfree\ (vlcData->argv\[i\])\;\n\ \ \ \ \}\n\ \ \ \ ckfree\ (vlcData->argv)\;\n\ \ \ \ vlcData->argv\ =\ NULL\;\n\ \ \}\n\n\ \ vlcData->state\ =\ libvlc_NothingSpecial\;\n\}\n\nvoid\nvlcExitHandler\ (\n\ \ void\ *cd\n\ \ )\n\{\n\ \ vlcData_t\ \ \ \ \ *vlcData\ =\ (vlcData_t\ *)\ cd\;\n\n\ \ vlcClose\ (vlcData)\;\n\ \ ckfree\ (cd)\;\n\}\n\nint\nvlcReleaseCmd\ (\n\ \ ClientData\ cd,\n\ \ Tcl_Interp*\ interp,\n\ \ int\ objc,\n\ \ Tcl_Obj\ *\ const\ objv\[\]\n\ \ )\n\{\n\ \ vlcData_t\ \ \ \ \ *vlcData\ =\ (vlcData_t\ *)\ cd\;\n\n\ \ vlcClose\ (vlcData)\;\n\ \ return\ TCL_OK\;\n\}\n\nint\nvlcInitCmd\ (\n\ \ ClientData\ cd,\n\ \ Tcl_Interp*\ interp,\n\ \ int\ objc,\n\ \ Tcl_Obj\ *\ const\ objv\[\]\n\ \ )\n\{\n\ \ char\ \ \ \ \ \ \ \ \ \ *tptr\;\n\ \ char\ \ \ \ \ \ \ \ \ \ *nptr\;\n\ \ int\ \ \ \ \ \ \ \ \ \ \ rc\;\n\ \ int\ \ \ \ \ \ \ \ \ \ \ i\;\n\ \ int\ \ \ \ \ \ \ \ \ \ \ len\;\n\ \ vlcData_t\ \ \ \ \ *vlcData\ =\ (vlcData_t\ *)\ cd\;\n\n\ \ vlcData->argv\ =\ (const\ char\ **)\ ckalloc\ (sizeof(const\ char\ *)\ *\ (size_t)\ (objc\ +\ 1))\;\n\ \ for\ (i\ =\ 0\;\ i\ <\ objc\;\ ++i)\ \{\n\ \ \ \ tptr\ =\ Tcl_GetStringFromObj\ (objv\[i\],\ &len)\;\n\ \ \ \ nptr\ =\ (char\ *)\ ckalloc\ (len+1)\;\n\ \ \ \ strcpy\ (nptr,\ tptr)\;\n\ \ \ \ vlcData->argv\[i\]\ =\ nptr\;\n\ \ \}\n\ \ vlcData->argc\ =\ objc\;\n\ \ vlcData->argv\[objc\]\ =\ NULL\;\n\n\ \ rc\ =\ TCL_ERROR\;\n\n\ \ strcpy\ (vlcData->version,\ libvlc_get_version\ ())\;\n\ \ tptr\ =\ strchr\ (vlcData->version,\ '\ ')\;\n\ \ if\ (tptr\ !=\ NULL)\ \{\n\ \ \ \ *tptr\ =\ '\\0'\;\n\ \ \}\n\n\ \ if\ (vlcData->inst\ ==\ NULL)\ \{\n\ \ \ \ vlcData->inst\ =\ libvlc_new\ (objc,\ vlcData->argv)\;\n\ \ \}\n\ \ if\ (vlcData->inst\ !=\ NULL\ &&\ vlcData->mp\ ==\ NULL)\ \{\n\ \ \ \ vlcData->mp\ =\ libvlc_media_player_new\ (vlcData->inst)\;\n\ \ \}\n\ \ if\ (vlcData->inst\ !=\ NULL\ &&\ vlcData->mp\ !=\ NULL)\ \{\n\ \ \ \ rc\ =\ TCL_OK\;\n\ \ \ \ libvlc_audio_set_volume\ (vlcData->mp,\ 100)\;\n\ \ \ \ Tcl_CreateExitHandler\ (vlcExitHandler,\ cd)\;\n\ \ \}\n\n\ \ return\ rc\;\n\}\n\nstatic\ const\ EnsembleData\ vlcCmdMap\[\]\ =\ \{\n\ \ \{\ \"close\",\ \ \ \ \ \ vlcReleaseCmd\ \},\n\ \ \{\ \"duration\",\ \ \ vlcDurationCmd\ \},\n\ \ \{\ \"gettime\",\ \ \ \ vlcGetTimeCmd\ \},\n\ \ \{\ \"init\",\ \ \ \ \ \ \ vlcInitCmd\ \},\n\ \ \{\ \"isplay\",\ \ \ \ \ vlcIsPlayCmd\ \},\n\ \ \{\ \"media\",\ \ \ \ \ \ vlcMediaCmd\ \},\n\ \ \{\ \"pause\",\ \ \ \ \ \ vlcPauseCmd\ \},\n\ \ \{\ \"play\",\ \ \ \ \ \ \ vlcPlayCmd\ \},\n\ \ \{\ \"rate\",\ \ \ \ \ \ \ vlcRateCmd\ \},\n\ \ \{\ \"seek\",\ \ \ \ \ \ \ vlcSeekCmd\ \},\n\ \ \{\ \"state\",\ \ \ \ \ \ vlcStateCmd\ \},\n\ \ \{\ \"stop\",\ \ \ \ \ \ \ vlcStopCmd\ \},\n\ \ \{\ \"version\",\ \ \ \ vlcVersionCmd\ \},\n\ \ \{\ NULL,\ NULL\ \}\n\}\;\n\nint\nTclvlc_Init\ (Tcl_Interp\ *interp)\n\{\n\ \ Tcl_Namespace\ *nsPtr\ =\ NULL\;\n\ \ Tcl_Command\ \ \ ensemble\ =\ NULL\;\n\ \ Tcl_Obj\ \ \ \ \ \ \ *dictObj\ =\ NULL\;\n\ \ Tcl_DString\ \ \ ds\;\n\ \ vlcData_t\ \ \ \ \ *vlcData\;\n\ \ int\ \ \ \ \ \ \ \ \ \ \ i\;\n\ \ int\ \ \ \ \ \ \ \ \ \ \ rc\;\n\ \ const\ char\ \ \ \ *nsName\ =\ \"::tcl::tclvlc\"\;\n\ \ const\ char\ \ \ \ *cmdName\ =\ nsName\ +\ 5\;\n\n#ifdef\ USE_TCL_STUBS\n\ \ if\ (!Tcl_InitStubs\ (interp,\"8.3\",0))\ \{\n\ \ \ \ return\ TCL_ERROR\;\n\ \ \}\n#else\n\ \ if\ (!Tcl_PkgRequire\ (interp,\"Tcl\",\"8.3\",0))\ \{\n\ \ \ \ return\ TCL_ERROR\;\n\ \ \}\n#endif\n\n\ \ vlcData\ =\ (vlcData_t\ *)\ ckalloc\ (sizeof\ (vlcData_t))\;\n\ \ vlcData->interp\ =\ interp\;\n\ \ vlcData->inst\ =\ NULL\;\n\ \ vlcData->mp\ =\ NULL\;\n\ \ vlcData->argv\ =\ NULL\;\n\ \ vlcData->state\ =\ libvlc_NothingSpecial\;\n\n\ \ nsPtr\ =\ Tcl_FindNamespace(interp,\ nsName,\ NULL,\ 0)\;\n\ \ if\ (nsPtr\ ==\ NULL)\ \{\n\ \ \ \ nsPtr\ =\ Tcl_CreateNamespace(interp,\ nsName,\ NULL,\ 0)\;\n\ \ \ \ if\ (nsPtr\ ==\ NULL)\ \{\n\ \ \ \ \ \ Tcl_Panic\ (\"failed\ to\ create\ namespace:\ %s\\n\",\ nsName)\;\n\ \ \ \ \}\n\ \ \}\n\n\ \ ensemble\ =\ Tcl_CreateEnsemble(interp,\ cmdName,\ nsPtr,\ TCL_ENSEMBLE_PREFIX)\;\n\ \ if\ (ensemble\ ==\ NULL)\ \{\n\ \ \ \ Tcl_Panic\ (\"failed\ to\ create\ ensemble:\ %s\\n\",\ cmdName)\;\n\ \ \}\n\ \ Tcl_DStringInit\ (&ds)\;\n\ \ Tcl_DStringAppend\ (&ds,\ nsName,\ -1)\;\n\n\ \ dictObj\ =\ Tcl_NewObj()\;\n\ \ for\ (i\ =\ 0\;\ vlcCmdMap\[i\].name\ !=\ NULL\;\ ++i)\ \{\n\ \ \ \ Tcl_Obj\ *nameObj\;\n\ \ \ \ Tcl_Obj\ *fqdnObj\;\n\n\ \ \ \ nameObj\ =\ Tcl_NewStringObj\ (vlcCmdMap\[i\].name,\ -1)\;\n\ \ \ \ fqdnObj\ =\ Tcl_NewStringObj\ (Tcl_DStringValue(&ds),\ Tcl_DStringLength(&ds))\;\n\ \ \ \ Tcl_AppendStringsToObj\ (fqdnObj,\ \"::\",\ vlcCmdMap\[i\].name,\ NULL)\;\n\ \ \ \ Tcl_DictObjPut\ (NULL,\ dictObj,\ nameObj,\ fqdnObj)\;\n\ \ \ \ if\ (vlcCmdMap\[i\].proc)\ \{\n\ \ \ \ \ \ Tcl_CreateObjCommand\ (interp,\ Tcl_GetString\ (fqdnObj),\n\ \ \ \ \ \ \ \ \ \ \ vlcCmdMap\[i\].proc,\ (ClientData)\ vlcData,\ NULL)\;\n\ \ \ \ \}\n\ \ \}\n\n\ \ if\ (ensemble)\ \{\n\ \ \ \ Tcl_SetEnsembleMappingDict\ (interp,\ ensemble,\ dictObj)\;\n\ \ \}\n\n\ \ Tcl_DStringFree(&ds)\;\n\n\ \ Tcl_PkgProvide\ (interp,\ cmdName+2,\ \"0.1\")\;\n\ \ return\ TCL_OK\;\n\}\n=====\n\n'''mkvlc.sh'''\n======\n#!/bin/sh\n\ntv=8.6\nslext=.so\nos=`uname\ -s`\narch=`uname\ -m`\nbits=64\ncase\ \$arch\ in\n\ \ i?86*)\n\ \ \ \ bits=32\n\ \ \ \ \;\;\nesac\ninc=-I/usr/include/tcl\$\{tv\}\nlib=\nlv=\$tv\nif\ \[\ \$os\ =\ \"Darwin\"\ \]\;\ then\n\ \ slext=.dylib\n\ \ #\ for\ MacPorts\ tcl\n\ \ inc=-I/opt/local/include\n\ \ lib=-L/opt/local/lib\n\ \ inc+=\"\ -I/Applications/VLC.app/Contents/MacOS/include\"\n\ \ lib+=\"\ -L/Applications/VLC.app/Contents/MacOS/lib\"\nfi\n\n\$\{CC:-cc\}\ -O\ -shared\ -fPIC\ -o\ tclvlc\$\{slext\}\ \$inc\ -DUSE_TCL_STUBS\ tclvlc.c\ \$lib\ -ltclstub\$\{lv\}\ -lvlc\ntest\ -d\ \$os\ ||\ mkdir\ \$os\nif\ \[\ -f\ tclvlc\$\{slext\}\ \]\;\ then\n\ \ echo\ \"tclvlc\ success\"\n\ \ mv\ -f\ tclvlc\$\{slext\}\ \$os/tclvlc\$\{bits\}\$\{slext\}\nfi\nif\ \[\ \$os\ =\ \"Darwin\"\ \]\;\ then\n\ \ install_name_tool\ -change\ \"@loader_path/lib/libvlc.5.dylib\"\ \"/Applications/VLC.app/Contents/MacOS/lib/libvlc.5.dylib\"\ Darwin/*\nfi\n======\n\n'''winmkvlc.sh'''\n======\n#!/bin/bash\n\ntest\ -d\ Windows\ ||\ mkdir\ Windows\n\ncase\ \$MSYSTEM\ in\n\ \ *32)\n\ \ \ \ gcc\ -m32\ -shared\ -static-libgcc\ -DWIN_TCL_INTERFACE\ -o\ Windows/tclvlc32.dll\ \\\n\ \ \ \ \ \ \ \ -I'/home/bll/vlc/vlc-2.2.4/include'\ \\\n\ \ \ \ \ \ \ \ '-Wl,-rpath=/c/Program\ Files\ (x86)/VideoLAN/vlc'\ \\\n\ \ \ \ \ \ \ \ -I\$HOME/local-32/include\ -DUSE_TCL_STUBS\ tclvlc.c\ \\\n\ \ \ \ \ \ \ \ -L\$HOME/local-32/lib\ -ltclstub86\ \\\n\ \ \ \ \ \ \ \ -L'/c/Program\ Files\ (x86)/VideoLAN/vlc'\ -lvlc\n\ \ \ \ \;\;\n\ \ *64)\n\ \ \ \ gcc\ -m64\ -shared\ -static-libgcc\ -DWIN_TCL_INTERFACE\ -o\ Windows/tclvlc64.dll\ \\\n\ \ \ \ \ \ \ \ -I'/home/bll/vlc/vlc-2.2.4/include'\ \\\n\ \ \ \ \ \ \ \ '-Wl,-rpath=/c/Program\ Files/VideoLAN/vlc'\ \\\n\ \ \ \ \ \ \ \ -I\$HOME/local-64/include\ -DUSE_TCL_STUBS\ tclvlc.c\ \\\n\ \ \ \ \ \ \ \ -L\$HOME/local-64/lib\ -ltclstub86\ \\\n\ \ \ \ \ \ \ \ -L'/c/Program\ Files/VideoLAN/vlc'\ -lvlc\n\ \ \ \ \;\;\nesac\n======\n\n<<categories>>Package\ |\ Multimedia} CALL {my revision {VLC Tcl Extension}} CALL {::oo::Obj1100379 process revision/VLC+Tcl+Extension} CALL {::oo::Obj1100377 process}

-errorcode

NONE

-errorinfo

Unknow state transition: LINE -> END
    while executing
"error $msg"
    (class "::Wiki" method "render_wikit" line 6)
    invoked from within
"my render_$default_markup $N $C $mkup_rendering_engine"
    (class "::Wiki" method "render" line 8)
    invoked from within
"my render $name $C"
    (class "::Wiki" method "revision" line 31)
    invoked from within
"my revision $page"
    (class "::Wiki" method "process" line 56)
    invoked from within
"$server process [string trim $uri /]"

-errorline

4