Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- local component = require("component")
- local shell = require("shell")
- local event = require("event")
- local args, options = shell.parse(...)
- -- 'Smart' Computronics Tape Player Script
- -- Automatically rewinds and loops tape
- if not component.isAvailable("tape_drive") then
- io.stderr:wrte("This program requires a tape drive to run.")
- return
- end
- local function tapePosToTime(pos,vers)
- local multi
- if vers == 1 then
- multi = 4096 --32768hz
- else
- multi = 6000 --48000hz
- end
- local seconds = tonumber(pos) / multi
- if seconds <= 0 then
- return "00:00:00";
- else
- hours = string.format("%02.f", math.floor(seconds/3600));
- mins = string.format("%02.f", math.floor(seconds/60 - (hours*60)));
- secs = string.format("%02.f", math.floor(seconds - hours*3600 - mins*60));
- return hours..":"..mins..":"..secs
- end
- end
- local function getTapeDrive()
- --Credits to gamax92 for this
- --Taken from Computronics tape.lua
- local tape
- if options.address then
- if type(options.address) ~= "string" then
- io.stderr:write("'address' may only be a string.")
- return
- end
- local fulladdr = component.get(options.address)
- if fulladdr == nil then
- io.stderr:write("No component at this address.")
- return
- end
- if component.type(fulladdr) ~= "tape_drive" then
- io.stderr:write("No tape drive at this address")
- return
- end
- tape = component.proxy(fulladdr)
- else
- tape = component.tape_drive
- end
- return tape
- end
- local function handleTape(addr)
- os.execute("cls")
- local tape
- if addr ~= nil then
- tape = getTapeDrive(addr)
- else
- tape = getTapeDrive()
- end
- if not tape.isReady() then
- io.stderr:write("The tape drive does not contain a tape.")
- return
- end
- local tape_label = tape.getLabel()
- local tape_length = tape.getSize()
- local tape_type
- --DFPWM Vers for calculating time
- if tape_label == "Minecraft Radio" then
- tape_tape = 1; --32768hz
- else
- tape_type = 2; --48000hz
- end
- print("Playing Tape '"..tape_label.."' until silence is detected...")
- print("Tape Length: "..tapePosToTime(tape_length,tape_type).." - Tape Size: "..string.format("%02.f",math.floor(tape_length / 1024)).."KB")
- print(" ")
- print("Press [SPACEBAR] to exit script...")
- if tape.getState() ~= "PLAYING" then
- tape.play()
- end
- while true do
- local evt, addr, char = event.pull(1, "key_up")
- if char == 32 then -- space
- io.write("\nSpacebar pressed, exiting script...")
- break
- end
- if not tape.isReady() then
- io.stderr:write("\nThe tape was removed! Waiting for tape...")
- while not tape.isReady() do
- os.sleep(1);
- end
- io.write("\nTape detected. Rewinding and restarting tape...\n")
- tape.seek(-tape.getSize())
- os.sleep(1)
- handleTape(addr)
- break
- end
- local tapepos = tape.getPosition()
- io.write("["..tape.getLabel().."] "..tape.getState()..": "..tapePosToTime(tapepos).." ("..string.format("%02.f",math.floor(tapepos / 1024)).."KB) \r")
- --if we find three nil bytes in a row, assume silence
- if tape.read(false) == 0 then
- tape.seek(1)
- if tape.read(true) == 0 then
- if tape.read(true) == 0 then
- io.write("\nRewinding and restarting tape...\n")
- tape.stop();
- tape.seek(-tape.getSize())
- tape.play();
- end
- end
- end
- end
- end
- if args[1] == nill or args[1] == "tape" then
- handleTape(args[2])
- else
- print("Usage: radio [tape] [tapedeck_addr]")
- return
- end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement