| |
Sections:
|
Document last updated 30 November 2007 by Dane
New Feature for 3.3 or Later, Added to List
New "TalkBed" feature. Don't even think about it right now! I know it's gonna be challenging and futurish.
|
TODO/FEATURE List
For 3.2
- OVERLAY Overlay is essentially a done deal, it works great. We do need to still add ducking to it, which will require changes to System Prefs and to behavior, as follows:
Regarding Overlay ducking, which I suspect will be at least intermediate surgery...let's be sure we have a backwards reversion path handy in case this breaks something...(like you need *me* telling you things like that)
- Preferences Change: Add an "Overlay Ducking" feature to the "Voice Track" section of System Prefs, using a percentage textbox just like the other ducking option. To make it clear which is which, we should label them as "Voice-Track Ducking" and "Overlay Ducking." Both can share the same "Fade duration" variable. The overlay ducking settings used in Preferences can be considered universal for all overlays. There will be no ducking variables in the Overlay command lines in the program log.
- Behavior Difference: The behavior for overlay ducking is to fade partway down, play the overlay track, and then fade back up. This differs from the behavior for voice-track ducking, which is to start a new song with the volume turned partway down, play the voice-track, then turn the volume on the song up to full.
- Ducking should be made be applicable to any audio event that is playable through SoundPlay, including audio files, live-for, and relay-for. Switcher events won't be duckable.
- EXTENDED CLICKHOLD/TOUCH TO INVOKE CROSSFADE Just need to shorten it up a bit, and we'll have it! Let's go for 500 milliseconds or so and see how that looks.
- EXTENDED CLICKHOLD/TOUCH TO DISPLAY FILE INFO Just need to shorten it up a bit, and we'll have it! Let's go for 500 milliseconds or so and see how that looks.
- PREVIEW FOR NEXT-TO-PLAY EVENT Currently there is no way to preview the next-to-play event, which should really be made possible if it's...possible. :-)
Return to Top
The following items are considered completed features and fixed bugs in 3.2...
- CHANGE WORDING FOR "AUDITION" IN PREFS Currently the sound card selector says "Audition." We should change it to match the "Preview" on the interface button. We also might want to try and move it into a box so it's not floating out there by itself.
- CROSSFADE
If two attempts at crossfading occur "back to back," the second crossfade event results in the crossfader being offset by one event, so that it shows up instead in the next-next-to-play position. At present there must be a "normal" event after every crossfade event to avoid the bug.
- Implement click-hold/touch-hold actuation (instantiation?) of the crossfader after a one-second delay. Cedric, maybe you can try and keep this code nicely "portable" since we will likely need it in at least one other situation (for Get Info) and possibly others in the future.
- Use longer background image and alternate slider gadget I sent
- Only eject the previous audio file if it was completely faded out by the crossfader
- Make any audio file (not just next-to-play) crossfade friendly
- Center the slider gadget directly over the event's start button when it first appears
- Fix bug that makes overlay for green button appear up at the top in the next-to-play position
- PREVIEW Dragging an event to the Preview button plays it through the second sound card, selectable via new Preferences option. Clicking the Preview button stops the preview.
OVERLAY DUPLICATION If a program log containing overlays is reloaded, the timers already in memory are not dumped, resulting in TWO events starting each time an overlay is scheduled.
- PRE-SETTABLE VOLUME LEVELS Volume levels can be set in-advance on listview events are remembered, and if you click on the volume control icon later, it doesn't jump back up to the top...the pointer arrives at the correct location on the screen, regardless of whether the event is currently playing, next to play, or a green-buttoned event that will play later. cd: the mouse-pointer cannot arrive at a specific location on-screen, but I guess you mean the control icon, right ..? I mean that, once a volume is pre-set, it won't be "unset" if the user clicks a second time on the volume icon. The mouse pointer should arrive at the position previously set, rather than jumping the volume back to the top if the volume icon is again clicked-and-held. The reason this is important is because, once a song is started, the DJ will need to adjust the volume back up when he is done talking. We don't want the volume to leap to the top when he clicks on the icon to adjust the volume.
- MANUAL VOLUME BOOST changed the useful volume range to [0.0 ~ 2.0] (i.e. it's now capped at 2.0 instead of 1.0) so that the user may tap SoundPlay's "volume boost" capability.
- TRIM ATTRIBUTE TrimStart and TrimEnd will just be math tricks that tell TuneTracker to start x-many seconds into a song and/or end x-many seconds from the end of a song. The purpose will be to eliminate silence or near-silence from imported MP3s and other tracks that were not ripped using something equivlant to TunePrepper.
- REAL-TIME AWARENESS Maybe not the best way to label this, but what I'm hoping for is a situation where, whenever Command Center is launched, it figures out EXACTLY where it should be, including the location where it should be in the song or program it should be running, based on calculated running times, so that it can join an event in-progress. This capability should extend to live events and switcher events as well. I know, it's a monster, but it's definitely the next step in our "evolution."
- SS "IMMUNITY" FOR PAUSE: Fixed a subtle Scrollable-TextView display bug: the scrollbar used to get "out of sync" with the scrollable area if "Enter" (enlarge/shrink) was called from a state other than scroll-knob-at-the-top. (didn't know I had to call r.OffsetTo(0.0, 0.0) before calling SetTextRect()).
- F1 FOR HELP: To replace the help-button, one may now invoke help via the keyboard, using the F1 key.
- SHIFT-SPACE FOR EXACT TIME START Doing Shift-Space will panic the automation to the exact right event and exact right time in the event. Works for... (find out it works and doesn't work for)
- EXACT TIME REBOOT STARTS: Dmp in)" to "Nearest second (mid-event)"
- OVERLAY FEATURE: "# Overlay :05:30 Comment SomethingOrOther" will cause Command Center to play an ID or other event over the top of a currently-running event, regardless of whether the event is a digital audio file, a Live event, or a Relay event. Only applies in auto-on, so DJ doesn't get surprised during a live show.
- TRIMSTART AND TRIMEND Felt very natural to code now that the code makes it easy to add that kind of feature. Trimming is now completely transparent to the rest of the code, i.e. its "maths" are done first, all the rest (Segues ..etc) second. TuneTracker now deals with those two BFS attributes, of type "float": "tunetracker:trim_start" and"tunetracker:trim_end"
Return to Top
For 3.3 and Beyond (in no particular order)...
- # TALKBED If it weren't for some of the things we've already done that would tend to lay the groundwork for this new feature, I wouldn't even bring it up, because it's clearly a challenging one. But given that some of this is already in CC's architecture, maybe it's at least a "considerable possibility" at this point.
The idea is to allow for a "talkbed" (instrumental) to be played beneath a DJ-track. When invoked, it will cause any audio file to be layered over an instrumental. The instrumental gets killed, or better, quickly faded out, just as the DJ file ends. The syntax could be something like:
/boot/Station/Promos/Promo3.mp3
# Talkbed Comment JazzInstrumental
/boot/Station/DJs/DaneScott_37.mp3
/boot/Station/Music/SomeSong.mp3
In that first scenario, the selected jazz instrumental and the Dane Scott track would start together. The talkbed would end and eject, just as the Dane Scott track ends. By including the atribute and value, it allows CC to rotate through all the available talkbeds, using a different one each time.
Now...as if that isn't challenging enough already...
What if we want the talkbed to surrender to the ramp of a song, as soon as the DJ file's remaining seconds is equal to the ramp time of the song?
/boot/Station/Promos/Promo3.mp3
# Talkbed Comment JazzInstrumental
# VT
/boot/Station/DJs/DaneScott_37.mp3
/boot/Station/Music/SomeSong.mp3
I'm not sure whether that's the best approach or not, syntaxwise, but the idea here is that as soon as the remaining time on the voice track is equal to the ramp time, CC would start the song in normal faded-down, voice-track fashion, and rapidly turn down and eject the instrumental track. I'm also not sure whether we're better off with a standard track or a hottrack for the TalkBed feature, so that's also up for grabs.
- USE OF TEXTBOX FOR STATUS NOTIFICATIONS When Command Center is doing something that requires time to complete, such as loading a log, reparsing the log, doing a shift-space exact-time start, etc., Command Center displays a status notification in the scrolling text box. Light blue in color, large font to make it really jump out and be noticed. As soon as the task is completed, CC restores the previously-displayed text to the scrolling textbox. So it must store and remember the previous text's location so it can get back to it afterward. Example Image. I am suggesting we do this in a cool blue rather than using the hot red we use for error messages, since these new messages are saying, "everything's ok, just wait" rather than "uh oh, problems!" :-)
VOLUMEDRAG AFFECTS EVENTS When clicking/holding on a volume icon, and dragging the volume up and down on the big volume control, it's possible to accidentially drag events around in the listview if you're not careful. If your mouse cursor is a little too far over to the left, you'll see one of the events' drag boxes moving around. Happens with both the mouse and the touchscreen. This one may be fixed, I can't recall. I'll test it again when I have a new touchscreen and driver. I THINK it's ok.
- SHIFT-SPACE OPTIMIZATION/b> Doing shift-space results in a considerable delay as CC travels miles across the log recalculating running times. As we discussed, we can make this easier for CC to do quickly by calculating from the last # Interrupt/Hour statement instead.
SMART INTERRUPTS Right now, if an infinite event fails, there is no good way to "fill" the leftover time between the start of the infinite event and the interrupt that...uh...interrupts it. Example:
# hour 3
# Live-For 99:00:00
# Interrupt@:59:50
/path/StationID
# hour 4
If the Live-For silence-senses, we go slam-bang into the StationID and hour 4. Not the best situation. Ideally we should have something like this:
# hour 3
# Live-For 99:00:00
/path/music/song
/path/music/song
/path/music/song
(etc)
# Interrupt@:59:50
/path/StationID
# hour 4
TuneTracker should understand that if the infinite event fails prior to the interrupt, it should advance to the very next event on the log. You might say we are "resetting the interrupt."
SS OVERHAUL Cedric, is this one done already? "GREY-OUT" AND GENERAL OVERHAUL OF SILENCE-SENSOR PREFERENCE GUI: Cedric sez:* there is indeed no BT-box equivalent to our "threshold" configuration parameter.. this will have to be greyed-out or something, when in BT mode. * there is (somewhat) an equivalent to our "duration beneath threshold"
configuration parameter: one may set it between 2 and 9999 (!) seconds.
To make things easier, maybe I'll outright change the widget within
the tunetracker Preference Window, and make it a BSlider instead
of a BTextControl... It looks good (tried it in another C++ project of mine)
and would make things streamlined.
* there is, even, a setting which "we" do not have, that was unknown
to us before: the "duration of active noise before REsetting the sensor"
setting; I guess we'll probably just hardcode it to 2 seconds or
something, to keep it simple, though we could choose to implement
it AND retroactively implement it for SoundPlay as well, on the other hand...
Maybe when having less of urgent things to do.
SHUTTLEPAD TOUCHES ARE FUNKY This one's a little spooky... :-) ShuttlePad displays, or doesn't display, the contents it is holding, depending on what other items I touch first. The strangest part is that it doesn't seem to follow any predictable pattern. Sometimes if I touch ShuttlePad (no result) then I touch, say, a hotbutton, then re-touch ShuttlePad and get a result. Other times I can repeat the same process and don't get a result. Ultimately I have found that if I touch enough stuff, or the right stuff, then go back to ShuttlePad and touch it, it displays its contents in the textbox. This might be beyond the reach of mortal intervention! I'm using the touchscreen driver you sent me April 3rd.
HOUR ZERO IMPLICIT Let's see if we can get rid of this. It's not that big of a deal, but if a way can be found without it getting long and frustrating, it might help avoid some potential confusion for the user. If this needs to be pushed into 3.3 to keep us on schedule, it's ok.
- REVISED LISTVIEW DISPLAY Title larger and on first line. Artist stays current size and goes to the second line. Running time text edged down slightly. The word RAMP: is removed entirely. See illustration. CEDRIC NOTE...Let's NOT jump ahead and do this in 3.2. We will want something visually different and interesting in 3.3 since much of the rest of the 3.3 features will probably be "invisible" to the GUI.
- EXPIRES ATTRIBUTE "Expires" would be to prevent an outdated file from playing. Command Center would compare the date (and time?) in the Expires attribute to the current date (and time) and if the Expires attribute is older, that cut would not be played. We would log all Expires to the output log, something like: 10:33:00 The cut "$" is expired and was not played.
- LASTPLAYED ATTRIBUTE Command Center would be given the ability to log the start time of every played audio file, written directly to that audio file's LastPlayed attribute. This would serve many useful purposes, not the least of which would be a solid way to know whether TuneStacker is "playing fair" when doing randomizations. Initially I suggest we use this as an internal test mechanism, and eventually, if we decide to, make it available as a public Preferences option that can be turned on and off.
- EXPANDED INFO FEATURE If this isn't too hard to "compile" into a single text file, we could use the Info feature to display more attributes than just the Info attribute. That way, if no Info has been typed-in for the song, at least there will be some good basic information available about the song.
INFO: Joe Smith dedicated this album to his wife, who was pregnant with "Little Joe" Smith at the time. Little Joe grew up following in his daddy's footsteps, and eventually had his own successful recording career with the group, "Little Joe and the Farm Hands."
ARTIST: Joe Smith
TITLE: Georgia
ALBUM: Southbound Train
GENRE: Country
TEMPO: Medium
COMMENT: MorningsOnly
RATING: 3
PLAYING TIME: 2:48
RAMP: :17
- SWITCHER "SALVO" FEATURE More than one user has suggested we make it possible for a single configurable button to handle more than one switcher switch at a time. So it would be possible, for example to assign two or more switcher events to a single button click, resulting a channel 1 being routed to output 2, channel 3 being output to channel four, and channel 3 being output to channel five. What would be needed, I assume, is an "Add" feature in the area where the buttonpad and myshow switcher preferences are set. In terms of GUI, I picture something similar to what happens when you add more query layers in BeOS' Find window, or more protection layers in TuneStacker's ProximityGuard window.
- LIVE EVENT BUTTON DOESN'T TURN OFF Cedric sez: The "live" button does not come back up when a #live-for event terminates on its own... At least not as fast as it should -- this is because the concerned'live' track is STILL within SoundPlay, though in a "stopped-playing" state !
I'll have to implement the "clean up expired tracks instead of leaving them to linger" thing... Confirmed in testing here on 10/12/07
- SHOWTEXT FOR WEB-BASED SCRIPTS "For a lazy winter day sometime":
What we presently do...
# ShowText /boot/home/SomeTextFile.txt
What we might add as new functionality to the command:
# ShowText http://www.someurl.com/SomeTextFile.txt
cedric sez: [the code for this will be similar to the "quicktip" one, but] The
QuickTip uses a "hardcoded" (well known) filename,
whereas for this one I'll use the same external program (/bin/wget)
but I'll have to write a little code routine that computes
the "filename" from the URL, for instance "SomeTextFile.txt"
in your example below,
create a temporary directory within /tmp (so as to be clean
and system-friendly and all) and download it.
- RELAY BUTTON PARAMETER: URL This lets people put an item on the air from a remote stream by just clicking a custom button on their screen. The behavior would be to relay the URL as a floating hot track, until the user kills it manually. The hot track relay event would have a volume adjustment on it, just like any other hot track.
- NO AUTO IF NO LOG: One nag I should change for sure: the Auto button should stubbornely refuse to become "highlighted" if there are no logs loaded.
- DRAG-N-DROP TO CONFIGURABLE BUTTONS to set them in one fell swoop
Date: Mon, 10 Oct 2005 13:20:47 -0500
To: cdegea@free.fr
It would be very handy for the DJ if he could drag-n-drop from Tracker,
Lightning, heck, even from the event listview, directly to any one of the
JockPad buttons, to assign that file to the button automatically. When
they do, the JockPad button's text would light up momentarily as the
dragged item is passed over it. When dropped onto the button, TT would
assign that file to the button, as well as detect the filetype as either
Text or Audio and assign it as the correct type of button automatically.
The button menu also popus up right away so the user can manually enter a
label for the button.
- OUTPUT LOGGING OF GETPLAY: e.g. # GetPlay /boot/Station/Programs/Into Tomorrow/%D.mp3 should instead print the (computed) actual path. Given the current state of the code this is not possible, since LogInstructionLine::OutputLogRepresentation() does not know the current "TimeCookie" and thus cannot possibly call LogInstructionLine::GetSongPath(). Rather than hack it, I'll have to re-organize the code so that the TimeCookie is passed somehow.
- OUTPUT LOGGING OF OVERLAY: We should also log each Overlay event to the output log. This is important because Overlay will be primarily be used to play station IDs, and the station IDs must be logged to prove they played, for legal reasons.
- VOLUME BOOST SYNTAX MADE AVAILABLE TO ALL LIVE EVENTS This is going to be a rather major change, I suspect, but I want to be able to add a "command line style switch" to any audio event, whether live, relay, or digital audio file, to boost its volume by a given amount. I am not opposed to doing this with a line just above it that says something like, # Boost 4, rather than putting the syntax on the same line with the event. I'll leave it up to you to decide what sort of numerical values to assign to this.
- Even though I had struggled against this suggestion from Dane for about a
year, I'm now finding that it would be way more consistent to
not fill-out the green button "cut lengths" at startup time, but only
as RunningTimes gets running .
This would speed up startup, and allow me to have more consistency
in the code, and provide better accuracy. Is this still valid?
- FINISH OVERLAP: If there are ramps on either side of a voicetrack that equal
more than the length of the voicetrack, the answer is that we should split
the overlapping 50-50 between the preceding song and the following song.
"" Is this still valid?
- EDIT BUTTON SELECTS CORRECT LINE Pad editor: contextual-menu should open the tree-editor AND pre-select the right line in the treeview.
- KISSLIB BIGGIE : EXPANDABLE KISSTREEVIEW (used e.g. to configure the ButtonPad and MyShow)
should implement the collapse-subtree/latches.
Dane:
There are some down-pointing arrows along the left side of listview in
the editor windows that make it look like it should be possible to expand
and collapse the sections of the list, though that doesn't appear to be
implimented. That would actually be a *really* nice feature, since at a
station with multiple djs using multiple sets with multiple pages, the
overall list could rapidly get very, very long. If the list could be
collapsed by sets, and also by page, that would
make it easier to work with.
Others, to discuss and decide on a timetable for...
- TODO: implement *multiple* file refs in DnD of mp3 events et al
- TT "professional" enforcement?? Didn't work on that in along time..
- new Contextual Menu in PadEditor.cpp (with "make this set active" ..etc)
Dane:
> > - I wonder if we should give the user an option right in the Buttonpad
> > editor window and in the MyShow editor, to choose which button set to
> > display. Maybe we could make it possible to right-click on the name of a
> > set in the editor and choose "Display this set in TuneTracker" or
> > something
> > like that.
Cedric:
> The editor as it is today we get "for free" since it is provided by
> the kisslib, but customizing it involves recoding it (somewhat)
> from scratch, which is a multi-days project...
> Unless... hmm... unless I get away with triggering the display
> of the pop-up-menu via one of those nifty BMessageFilters,
> which would save me a rewrite of the whole thing and just
> "piggy back" the menu on top of the rest...
> And while we get to do this right-click menu, might as well add
> things like "cut" into it, so that it doesn't look too "short"... Anyway,
> can look into this if you want. But the "long" way (rewriting from
> scratch) I hope we never have to do :-)
- IMPLEMENT "macros" so as to be able to read that kind of alias, from a config text file:
# TimeAndTemp = # TimeAnnouce + # TempAnnounce
- Later: make a LISTVIEW instead of 3 boxes in Prefswin for transitions,
and then add a syntax to access custom made transitions like e.g.
#transit NORMAL /some/mp3/path
except that it's the _talk-over_ that needs to be marked,
or TuneStacker will have to do more inference/decision/intelligence..!
- To make the F10 key's behaviour persistent, add "__ Display Memo Lines"
as a look and feel preference.
- "Cue" (i.e. make volume-controls able to /pre/ set volume for an /upcoming/ T0)
- LOOK/FEEL: Make the text-view use a CustomScrollBar, not a BScrollView.
- OPTIM: optimize BlockyListView::ScrollToIndex(), which restarts from the beginning of the model each time (!)
- CUSTOMIZE VU, replicating SoundPlay's pop-up menu as-is: we should be
"" letting the user choose from one of several VU meter backgrounds in preferences.""
cedric's estimate: probably not hugely long to implement, but still about 10~15 hours [have to dynamically-re-layout the whole GUI when the size of the VU changes].
- "" Add an option in preferences that results in the adding of a line to our
BRS reboot script that will cause the launching of our "persistent weather
updating" script. The line can be: /boot/home/config/bin/UpdateWeather.sh &
- BUG ACKNOWLEDGED:
an #interrupt happening e.g. at the very beginning of a TuneTracker session, or whenever else there is nothing loaded up in SoundPlay, will properly add the "IRQ'ed track"
but fail to *schedule the rest of the automation* due to a lack of EJECT from the proxy (since there is nothing to eject yet since this is the very first transition)..
- ToneTracker RELAY INTERFACING:
The Broadcast Tools box also has a set of relay connections that are
*outgoing*. They are used to send a relay closure *out*. The outgoing
relay closures can be used to control external devices, and with a little
creativity, can be used to do almost anything...from starting a tape deck
to starting a reminder alarm, to turning on the coffee maker, to lowering
power on the transmitter.
# SendRelay 1
Using this simple behavior, we would just send the relay when CC arrives at
the event, the same as playing a song. In the example above, when CC
reaches the event, it would send a relay closure to Relay 1.
However, what if the user wants the relays to happen at very specific times
in the hour? In that case, we can't rely on the behavior above, unless we
interrupt the music to play the relay, which would be downright stupid.
:-) So I propose we have eventually do a second relay command that behaves
kind of like the PlayOver feature...
# Relay@:15:00 1
Now let's take that thought one step further. Suppose we had a standard
music hour.
1000
..just lots of songs. But at four times during the hour, we
wanted to send out a relay at a very specific time. Obviously, it won't
work to just scatter the # Relay@ events through the hour, because the time
at which CC arrives at each is unpredictable, and if it is arrived at
prematurely, then what? So I think a better approach is to put them all at
the end of the hour and require CC to be smart enough to look-ahead on the
log and handle them as they are needed. So it might look something like
this:
# Hour 1
/path/Song.mp3
/path/Song.mp3
/path/Song.mp3
/path/Song.mp3
/path/Song.mp3
/path/Song.mp3
/path/Song.mp3
/path/Song.mp3
/path/Song.mp3
/path/Song.mp3
/path/Song.mp3
/path/Song.mp3
# Relay@:05:00 1
# Relay@:15:00 1
# Relay@:30:00 1
# Relay@:45:00 1
## End of Hour
For the same reason, it would probably make sense for all of the PlayOver@
items to be placed at the end of the hour, after all other events...but
again, we're getting ahead of ourselves a little with all of this, because
I assume the new behavior requried for PlayOver@ and Relay@ would require
some serious revamping...and probably is more than we can mess with right
now.
So, concluding! The two that we need initially are...
# Listen-For 00:30:00 1
(monitor a particular relay channel for the time specified and respond with
a panic if a relay signal is received)
and
# SendRelay 1
(send a signal to the relay specified)
Dane adds: I spoke with the company, and found out how outgoing relays are triggered.
Sounds really simple. To send out a standard one-second relay closure, all
you need is the word "Pulse" and the relay channel to send it to. If, in
the future, we ever need to send a longer relay closure, we can use a
feature called "Latch" to hold a closure for as long as we like, until we
send a second Latch command that discontinues the closure. As for the
particulars of syntax, I'll refer you to their manual, which is what Ben
used for reference when putting in the commands ToneTracker uses to do its
other magic. Once you start looking over the available commands, lights
will undoubtedly start going off in your brain, and before long, you'll be
telling me, "did you know it can also do... this...and that...and the other
thing??!!" :-) One thing you *will* see in there is a way we can tell it
to do a fade-in or a fade-out. Not controllable by a slider. It's a
default five-second fade-in or out. But it might come in handy. Anyway,
here's the link to the manual...
http://www.broadcasttools.com/manuals/Manual_ACS8x2Plus.pdf
- Improve some more our already existing "Start at exact place" feature
so that it's the be-all-end-all out-of-this-world implementation it could potentially be :-)
Cedric sez:
It would be a relatively easy step to "go the extra mile"
and also enforce a super-granular (second-granular rather than
song-granular) approach. E.g. Tunetracker could actually wipe out all songs
from soundplay, and make it load up the one song that is supposed to be
already playing, and move the blue-bar progress cursor in soundplay to the
precise second the song ought to be located at (!). If we ever implement
such an "extra mile" for this feature, we'll probably want to wait until
the "Auto On" button is depressed before doing the wipe-out/recreate
thing... And how do we deal with scenarios where the user does NOT want it
to happen this way..
Dane sez:
I have actually had people ask for that feature. Several thoughts on it...
1. I like the idea, but would only want to see it implemented for reboot
recovery, and then, only if the option has been selected in preferences.
For instances where the power goes down and back up during the middle of a
long audio file such as a concert, this would be a tremendous benefit to
stations that specialize in that sort of programming.
2. As intimated in #1 above, I wouldn'
1000
t want TT to have that behavior
every time a log is loaded. That would be too "powerful" and potentially
create more problems than it solves. A hotkey that does a forced update to
an exact track and playing position would actually be an ok way to handle
it so that the user doesn't have to resort to rebooting (per #1 above) if
they did need to force TT to go to an exact-second-level-granularity in
order to get programming back on track. If we did assign a forced update
to a hotkey such as athe letter "u" on the keyboard, we might want to have
a confirmation box before actually doing it. Otherwise accidentally
bumping the "u" key (or whatever) would be an exasperating mistake. :-)
3. At least as important is that we find a way to be to-the-second
granular on our live events when we reload a log. TT needs to become very
smart about where it needs to be in a live event when a log is loaded.
Right now, it's very challenging to get TT to go live at the right place
when loading in a log that indicates we should currently be live. I
understand why that is difficult, with the various ways we go live, such as
sometimes using Live-For of a specific length while other times using an
infinite live event and an interrupt. But since we can calculate running
times, it seems to me TT should be able to also calculate when an event
should go live, which minutes it will be live, and when it will cease to go
live. Thus it should be possible for it to know if it should be live right
now, and for how much longer it should be live. So my question is, is it
possible for TT to start viewing live events kind of like songs and other
audio files, fron the standpoint of calculating what it needs to do when
going live following a log reload...essentially "joining a live,
in-progress" and correctly staying with it until the end of the live event?
- Improve the existing "Open Log With Editor..." feature to 'go the extra mile':
Do a little basheroo like this, to reload the log to take the user
changes into account:
When StyledEdit is closed by the user,
there would be an Alert that says, "If you made changes, would you like
TuneTracker to reload the log now?" If yes, we'd do ttreload, otherwise
we'd just close it.
Cedric sez:
Something like,
StyledEdit /path/to/the/log
if [ alert "If you made changes, would you like TuneTracker to reload
the log now?" ]
then
ttreload
fi
If I was more of a bash wizard, I'm sure I'd find even a
way to avoid being clumsy asking "if you made changes...." at all,
and only display the "/bin/alert" *IF* the user indeed made some
changes - -this would be achieved by comparing the "time stamp of
modification" of the file before and after StyledEdit is invoked or something.
- Fine-Tune output-logging (for RelaySwitcher et al):
Let's log something like:
00:00:00 Switcher 1 On - NBC News
00:05:01 Switcher 1 Off
By the way, if it doesn't complicate life too much, we
can logically eliminate the "Ramp" entry from all of the following:
Automated Live events
Automated Switcher events
All HotTracks launched from ButtonPad and MyShow
Live events launched from the ButtonPad
- Implement "trimming" of mp3 ..etc files, i.e. allow the user
to "virtually" trim audio files by adding a mere attribute instead of
having to go to soundforge or BAMBAM or something and have to edit the file itself.
The BFS attributes would probably be named "tunetracker:trim_begin" and "tunetracker:trim_end",
type float, expressed in seconds.
- Implement the "TrimFront" and "TrimBack" attributes and support code.
- The ever-difficult volume-boosting feature thingy (Cedric buries it
down here in the hope that Dane will forget about it *grin*):
Break compatibility to add "volume boost by +1.0 or even +3.0 ..Etc":
> > * we limitate the scope of this +n argument (to only
> > relay-for and live-for, e.g.) and make its syntax "coder-friendly"
> > by shifting it to the left like thus:
1000
> > # live-for +3 00:02:00
>
> Sure! That'll be just fine. Go with the "shift-to-the-left" approach. :-)
> Not sure we'd need to break compatibility, would we? Can't TT just assume a
> value of +0 (no change in volume) if a + value isn't given? I've seen lots
> of command line programs that assume a particular value if it isn't included
> by the user as a command line switch.
Command-line tools are a whole-no-ther-can-o-worms :-)
They use the "getopt()" API function, described here,
file:/boot/develop/headers/posix/getopt.h
which is a little beastly to use, though it allows for very
powerful (from the user point of view) feature.
Heck, even in the "keyfile_gen" command-line tool I've provided
you with, the one used to generate keyfiles for TTCC, I didn't
use it even though it was supposedly THE place to use it... So
I'm even less confident in using it in such a complex animal as TTCC :-)
Okay let's see - - I'll get back to the drawing board, and try to come up
with something that is both simple for me to implement (meaning it
won't lead to instability or bugs or maintenance hell) and powerful
(or at least unintrusive) for the user...
Maybe I can put the +n argument to the right rather than the left,
of course "optional" (omitable), and to the left for the other syntaxes,
and the hell with "consistency"..
Or if we need consistency, maybe I'll come up with a "#boost-next-line-volume"
contextual command or something.
A previous feature-request from Dane expressing something similar:
WANTED: New Optional PARAM to #relay syntax
- Add a switch for our relay-for feature that adjusts volume to something
higher than the standard volume, maybe like this:
# Relay-for Duration IPPath VolumeIncreaseAmount
So in use, it might look like:
# Relay-for 00:33:00 83.102.88.12:8000 +2
And yet more:
If we express the volume as a + amount, then TT will always know that what
follows the plus sign will be the amount of extra volume to send to
SoundPlay.
This is necessary because often "feeds" coming from other sources are not
sent at full volume, so when relayed, they're "weak" and don't match well
with the volume of the rest of the station's programming.
MORE : Dane wants the same additional param for LiveOn and play as well: =============
==================================
> Regarding the 3.1 Relay volume thing, I was thinking that whatever we dream
> up for this should be kept flexible enough to apply to other items as well.
> For example, some stations complain that a certain news service's newscasts
> are always too low. So maybe we can also have the TuneTracker equivalent of
> a Play command, called something like "# BoostPlay" ...
>
> # BoostPlay /boot/path/filename.mp3 +2
>
> Similarly, sometimes the signal coming into Line-In isn't quite strong
> enough, so we could also do this...
>
> # Live On +2
>
> As to the specific syntax, I suppose that could also be something like:
>
> # Live On Vol +2 (??)
> Alternatively, we could use the on-disk mp3 file attribute
> coding for such level-boost (there exists one, gotta dig it up),
> so that users don't have to modify every single line of
> their master-log referring to "/boot/path/filename.mp3" with a "+2"
> (and *I* don't have to handle those PITA syntax thinggies :-P)
> but just have to edit the attribute of that very file...
>
> And thus the boost would work also when the file is not
> hardcoded in the MasterLog but instead generated into
> the proglog by a "Random Jazz Protect" master line or some such,
> since the boost would *not* be dependant on the generated line's syntax.
>
> Either TT or SP would have to read that attribute (SP is
> already able to, I think) and boost up the SP volume
> knob accordingly.
>
> As to #LiveOn, why not make it a PreferenceWindow thing,
> again so that every single invokation of LiveOn enforces the
> setting (whereas one co
1000
uld easily forget to add a syntax-line argument..).
>
> Hmmm.... How do those ideas mesh with real-world usage & needs ?
They're all good, creative ideas...but they have their merits and their
drawbacks in a real-world situation. :-)...
In the case of line-in, some stations use a rotary dial to choose from
multiple input sources feeding the line-in...so their volumes vary. Thus TT
should be smart enough to compensate for the line-in levels expected at
varying times of the day.
In the case of using MP3 attributes to hard-code volumes to the files, the
problem is that the most unpredictable-volume files are those that are
auto-downloaded from the web...coming from other sources and at times when
nobody will necessarily be there to add attributes to them.
The files found randomly must be properly engineered to start with...since no
radio station's automation can be responsible for tweaking every song in a
library as it is playing back.
Definitely, I think, the per-line-in-the-master-log approach would be
preferable, if we can pull it off.
UPDATE:
Dane eventually agreed to have an on-disk attribute:
Here's the "spec" I responded with:
So if we are the "only" ones using it, I have all the freedom I
need to spec it: Me, c.d., in my quality as grand ayatolla of
TT code, I hereby issue the following edict:
Whereas a so-called "Audio:VolumeAdjustment" mp3 BFS
attribute currently exists, and may be edited either by downloading
the "audioinfo" plug-in from bebits, or (better) outright configuring
OpenTracker to display this attribute just like it does others,
Whereas the Audio:VolumeAdjustment attribute
of type int32 is known to have legal values in the -4.....+4 range,
Whereas we wish for its value to have the following
semantics: 0 is mapped to SoundPlay's normal "1.0" volume,
and +4 is to be mapped to SoundPlay's "2.0" maximum volume,
It is heretofore claimed that the following change will have to be
done to the TuneTracker code, at a later date of our choosing:
1) PlayerPerformer/SPProxy's handling of so-called "physical files"
ought to read and take into account the aforementionned attribute,
2) It should thus "patch" the volume value it has received from
TransitionEngine (in the 0.0.....1.0 range) with this formula:
patched_volume = volume_param + (attribute_value/4)*1.0
End-of-Edict.
:-)
This is the so-called change-log, especially useful to Cedric so that he may play smart-ass and reply to Dane's inquiries with stuff like "oh yeah, feature xyz is broken, I know about it for sure, had regressed back in 3.0.19 days back on 2007-02-28, been planning to fix it ever since", errr... This section is especially Cedric's responsibility to keep well-maintained, for his own sake (and Dane's :-). All history-entries are to be dated and of course build-version numbered.
3.1.11 "carload" (2007 10 20)
Truckload of small thingies, this time..
- CrossFader feature "feel" now implements click-n-hold: the user
now must hold down LMB for a second to invoke the crossfader, otherwise
the old behavior is used instead (i.e. start song with full volume from the get-go).
- EventLine: Fixed the "LMB click-n-hold will trigger the GetSongInfo" feature "Feel":
it now no longer requires knowing the "secret handshake" to trigger it
after holding the button for 2 seconds...
J/K, but hey, the previous implementation was indeed shaky.
Things have changed now thanks to the little brainstorming
I've done for the "crossfader click-n-hold" feature -- /that/ feature
and /this/ feature now rely on Pulse(). I'm not a big fan of the Pulse()
callback :-) but gotta admit the implementation should be reasonably robust
and reliable thanks to it.
- Made the CrossFader display "pixel perfect". E.g. found that I had
to inset the window rectangle by 2 pixels horizontally and 3 pixels vertically
to define the inner "cursor gadget" rectangle.
- Optimized the CrossFader display a bit to make it consume a little less CPU.
- Prefs GUI: neatly re-organized the "Misc" pane a bit.
The look-n-feel prefs are now together (VU and Localization are grouped at the bottom).
Broadcast ops is still at the top. A new BBox group has been created
inbetween: "Preview", with the combo-box-previously-known-as-audition
(and now named "Soundcard") with the following help string:
"Which soundcard to use for Preview output (most likely select one separate from the 'broadcast' soundcard!)."
- Fixed the Overlay "dupe invokes" evil bug occuring when reloading a log:
the TimerRunner destructor was never called, due to an
arcane C++ "feature" (lack of cast meant incomplete delete job).
3.1.10 "a little snapshot" (2007 10 11)
..
- CrossFader: New Gadgetry PNG pics: now using a 324 pixels background
and a 63x63 instead of 77x64 pixels slider gadget.
- CrossFader: Extended the CrossFader feature to green buttons
(i.e. it's not only for Gold-button n2p any more).
Look-and-feel wise this is less "perfect" than in the case of the Gold Button
event, since green-button events are propelled up to the top of the listview
when invoked, but people using this feature will most likely focus their
eyes on the CrossFader itself and not on whatever happens left,
so this should be no big deal. The only "keep an eye on potential problems"
warning I can think of, is the Ramp Countdown: people might potentially need
to watch the countdown as they cross-fade, and in the Green Button
case that would involve a bit of eye "gymnastic", so to speak.
- CrossFader: Modified the "slider gadget" grab point: it's now center,
instead of far-left.
- CrossFader: Added some math safeguards, bracketing the
crossfade value between 0.0 and 1.0 (it could go a bit "wild" in the previous build).
- CrossFader: fixed the popup's starting location (for "green" event lines,
"gold" ones were already fine): the clicked button (be it green or gold)
will now send its coords along inside its invokation BMessage,
so the CrossFader BWindow builds itself correctly.
- CrossFader: ejection of "older track" is now longer systematic -- now
depends on the terminal position of the mouse (and thus position of the slider gadget):
if fully to the right, eject, otherwise, oldertrack is left running as a hot-track, with
its (yet-remaining-from-fade) volume intact -- could be useful for some special
purposes fades, I understand.
- While toying around, managed to reproduce the Crash (SegFault)
in EventsModel::MsgRcv(), that's weird...
Anyway, added some ASSERT() in case in happens again, will know for sure..
Dane if you manage to "hit" the ASSERT()s (i.e. manage to crash it
in there again), this new build will give more info to the programmer, it will
give a bone to me :-) so that I may fix it -- the prev build lacked useful
ASSERT statements, too hard to diagnose.
3.1.7 "new car" (2007 09 12)
What doesn't kill you, makes you stronger, they say :-)
So I'm back and kicking!
This build should be very very close to production-quality (was about
time!)
and with a new feature to boot.
- Pre-settable volume levels:
Good as done. Careful when using though:
if an event is in #fade-in context, the user-specified preset will be
superceded by the fade-in command. Can't think of any other
problematic scenario except this one... The thing seems to work pretty
well.
Was a kinda major undertaking and took 2 full days to code
though, but now it's done, enjoy it :-)
- Probably fixed the reboot-recovery "song granular" cursor
placement:
during recent changes, had forgotten to issue a call to
transitionEngine->SetActiveEventIndex_AsPerSimulatedEventIndex()
before issuing a call to
transitionEngine->StartActiveEvent_AsPerSimulatedSeekOffset()
, resulting in silent failure of Seek in the latter and
thus NO song-specific placement at all, but mere "time correct based"
cursor placement instead. Have now added the missing call.
- GUI / PreferenceWindow: changed labels;
"Calculate next-to-play event based on..." to "After reboot, start log
at..."
"Best-effort (from start)" to "Nearest event"
"Best-effort (jump in)" to "Nearest second (mid-event)"
- Probably fixed a bad interaction between the BeOS registrar
(BTimeRunner "server") and TuneTracker, impossible to reproduce-at-will
but with deadly (as in "dead in the water") consequences should it happen.
Was prompted to do this after experiencing something very similar
to a rare bug reported by Dane, whereby his TTCC had failed to
start cuts for 10 or 15 times (as if the Media Server had crashed
or something), and then resumed working out of the blue after a few
minutes :
saw something very much like this after doing some "panics" (spacebar
hits to go to next song), except my TTCC never recovered, it remained
dead :-)
Techie note:
as a "note to self", never leverage two timers both set to the same time
and expect them to always be triggered "in order": the registrar might
sometimes time re-arrange them for some reason, meaning you're S.O.L.
(i.e. the NO_POLL "stop old track and start new" thing is never done ever
after).
3.1.6 "all apologies" (2007 09 01)
Dang... Sample-station'ed this one, and didn't take long to
realize my implementation of the #overlay "pre scan" feature had messed up
some other code. Was quick to track down fortunately.
- GUI / volume knob: changed the useful volume range to [0.0 ~
2.0] (i.e. it's now capped
at 2.0 instead of 1.0) so that the user may tap SoundPlay's "volume
boost" capability.
- GUI / volume knob: change the mouse-tracking behavior to what is
(probably)
it's final, best-practice implementation :-) -- tracking now starts when
the mouse pointer
enters the BView's bounds for the first time after mouse-down,
and then never stops until the mouse-up event.
Had to use the B_ENTERED_VIEW code feature though, which I seem to recall
Zeta
doesn't like all that much...
- SS "immunity" for pause:
Ended up implementing this in a different way than first envisioned, with
a flag
in TransitionEngine. From this build on, whenever a pause-for is the
"PrimaryTrack()",
it will 'veto' any silence sensing (BT-box or soundplay based) until the
PrimaryTrack()
changes to something else.
- Fixed a stupid bug in ProgramLog::gotoFirstLine():
after running 3.1.5 on the sample station it was obvious I had broken
the CurrentIndex() management within program-logs (during my recent
#overlay
implementation), making them sometimes off-by-one. Fixed.
This affected much of the GUI, since it mostly relies on "index" ID
rather than "line-number" ID: running times, next-to-play,
double-click-to-make-next-to-play,
you name it.
3.1.5 "danger will robinson" (2007 08 20)
Another package from the "quite a bundle" department...
Here's hopping that I under-promised and over-delivered, contrarily
to the federal reserve bank :-P ("which is none of the above",
infamously).
LAST MINUTE: witnessed a bug, similar to one Dane had previously described
to me, though couldn't find a reliable way to reproduce it tonite:
it would seem that, if launching TT and then toying with the listview
scroll-knob,
and then hitting SHIFT-Space, the created GUI event-line will incorrectly
display a starting-at-beginning progress bar, instead of showing the same
progress ratio than the one effectively assigned to SoundPlay's track.
And it would SEEM that the GUI is not affected by this bug if one hits
shift-space directly (no touching the scroll-knob).
- Fixed the last remaining #warning I had set for myself in
BigMainWindow.cpp:
made the "command-arrows" keyboard shortcuts code more modular. No
functional changes.
- GUI / Big-ass volume knob and slide:
in trying to tackle the "pre-settable volume levels" feature request, I've
started to kinda fix (and break...) the volume slide knob. It used to
jump up to the top whenever
invoked, "forgetting" what the actual SoundPlay volume is -- it will now
directly
query SoundPlay before displaying itself, so as to be 100% foolproof
(even if
the D.J. changes the volume "behind our back"). The catch is, I had to
disable the call
to SetMouseEventMask() though (the "monitoring anytime, anyplace" mouse
pointer monitoring),
so things are dicey, ergonomy-wise. When I get back to this, I'll probably
want to re-enable the SetMouseEventMask() call, but only after the *first*
entry of the mouse pointer into the GUI widget, so that we have our cake
and eat it too.
Will get input from Dane to see what he prefers.
- Fixed a tiny GUI glitch with the drawing of the progress bar of
event-lines: the grey area
that is expanding right as an event plays, used to be offset one pixel
too far to
the right, leaving a bright vertical background line intact to the left.
Fixed.
- Fixed a subtle Scrollable-TextView display bug: the scrollbar used to
get "out of sync" with the scrollable area if "Enter" (enlarge/shrink) was
called from a state other than scroll-knob-at-the-top. (didn't know I had
to call r.OffsetTo(0.0, 0.0) before calling SetTextRect()).
- Under the hood: refactored and cleaned up some code in the
ActiveEventProxy
hierarchy -- moved the StartPerforming() code into
ActiveEventProxy::StartPerforming(),
as a "lowest common denominator" to all the variations that used to exist.
- Overlay: changed the 'licensing' of the Overlay feature: moved it
back to the "no special license required" zone, instead of it
requiring a "TT Pro" license field flag.
- Overlay: modified the Overlay syntax: it is now a fully-qualified
"hh:mm:ss .....",
instead of the older partial ":mm:ss .....".
- Overlay: modified handling: they're now "pre scanned", wherever they
are in the log. They're never stumbled upon while automating, only ever
read
at "pre scan" time. The user may put them all at the top of the log
(which makes
sense, given the new syntax), or may put them in their respective "hours",
though careful not to put an #overlay 17:00:00 in a block that starts
with a #hour 16 otherwise I can imagine the headache trying to imagine
"why the overlay feature does not work correctly"... until the user
figures out he did not "match" the right hour statement with the right
overlay statement :-)
Anyway, it's simpler and fool-proof to put them all at the top of the log
I guess.
- Overlay: they now apply only in "Auto On" context -- made them go
through
TransitionEngine first, before hopping to EventsServer, so that
TransitionEngine (which knows
about the automation status) may "veto" events before they reach
EventsServer
(which does not).
- Overlay: the "pre scan and set timers" routine will ignore any Overlay
that are
"in the past". Of course. Would be havoc if all the "overdue" overlays
fired up
at the same time whenever a log is loaded!
- Overlay: eventually got around to implementing *multiple* timers (to
handle multiple
overlay statements instead of clobbering a unique timer), phew :-)
3.1.4 "rushed biggie" (2007 07 03)
Fixes... Err... You want, err, fixes...
Here's hoping I get closer to production-quality :-P
Though on second thought, with my last minute fiddling with #Overlay,
the prospects of being total-stable again might be deffered by one more
build, whops..
- The "Help" button is now officially retired! On a minor note, this
means I've severed
the 'link' to its help file (i.e. the help-on-help file that is simply
named "help"... :-)
that was accessible when right-clicking the help button itself, so that
one file can be shelved I guess.
- To replace the help-button, one may now invoke help via the
keyboard, using the F1 key. Function keys used to cause problems
(work here but not work at Dane's), but those were in Zeta days,
it ought to work now that we're BeOS-max based I guess.
(whops... what of our existing Zeta-using customer base then.. damn)
- Changed a button label from "Audition ..." to "Preview".
- Fixed the Shift-space/Space keyboard combos:
the kbd code was a tad braindead, in that it would consider
Caps-Lock and Num-Lock to be like a depressed Shift-Key, ugh :-)
Works as it should, now.
- Fixed a rare failed-assert in PreferencesWin.cpp: the media kit
might, under Zeta apparently, sometimes return "zero" when
queried about how many soundcards are installed in the system.
This is dealt with thanks to an if() rather than an ASSERT() now.
- Fixed the "real time awareness" of next-to-play, which was
mistakenly enforced also at normal-log-loading-time, in addition
to being enforced at reboot/cold-start: having this "extra" actually
bought
us nothing good, and on the downside, it did entail a funky-looking
next-to-play (retarded by one line) until "auto-on" was depressed.
- Fixed Prefs-Window's excessive width, which was caused
by the recent changes in the "reboot recovery" box. Shortened
its labels a bit, and transferred some of my verbosity into
the "online help byline box" where it belongs instead :-)
- Refactored class LatchRelayHandler (the one in charge of
relay-triggered HotTracks)
so as to make it easier to implement #Overlay.
- While doing this, also ended up fixing a stupid bug where the
case-insensitiveness on the BQuery'ed attribute ended up being
stored into the rotation table itself, thus likely screwing up the
rotation cycle.
- *Not Production Grade Yet* (in fact, not event *tested* much) :
got started on Overlay, looking forward to introduce it in the *Next
Build*:
new syntax, #Overlay, Going like,
# Overlay :05:30 Comment SomethingOrOther
This feature designed to *not* be listview-visible.
This feature designed to be available only with the right *keyfile flag*
("TT professional", just like HotTrack and Route-For and stuff).
Currently ONLY SUPPORTS *one* overlay configured at a time
(clobbered each time you re-issue the syntax).
Yep, that's a trial balloon for this feature :-)
RUNNING INTO A FEW ISSUES ALREADY:
* As the Overlay currently code stands, overlays will be executed as
scheduled,
even if the user has momentarily *stopped* *automation* just before said
time (!)
Gotta make sure my EventsServer is aware of the automation status or
something.
Or (better) move the whole thingamadokie from EventsServer.cpp to
TransitionEngine.cpp ??
(come to think of it.... THIS BUG MIGHT ALSO EXIST for the older code I
had written
for relay-triggered HotTracks ? What if a relay closure happens while
automation is off ??)
So many questions, so little time to code it all :-P
* Gotta reset the "overlay handler" class each hour, so as not to leak
resources (timers).
Alternative (probably better): periodically check for the status of all
registered timers -- if
any are "in the past", then obviously discard them.
* In a "reboot recovery" scenario (as well as other scenarios),
TuneTracker might
skip over an #Overlay statement, ignoring it completely, even though (I
suppose)
the DJ's intent is to do apply them: just because you 'jump' into an hour
block
mid-stream, doesn't mean you want to ignore it's "overlaid tracks" that
(although
configured at the start of the hour) are scheduled to happen in the future
of the hour... Right ?
I have no idea how to technically solve this, if this ends up being an
issue indeed... (Dane's call).
* On the contrary, if one or more #overlay statements are stumbled upon,
whose time digits
are IN THE PAST (e.g. they say :30:00 even though the wall clock says the
time is 5:35:00 PM)
the current version of the code seems to "panic catch up",
to flush everything at once (launching all "overdue"
overlays!), which is not a behavior we want, right ?
3.1.3 "Audition and shift-space and stuff and oh my" (2007 07 25)
Lots of things put together a bit hastily, so you might want
to write me a wish-list of things to "polish" if you encounter bugs :-]..
- AUDITION: FIXED !
Tested to work with SB64 "Ensoniq PCI".
Tested to work with "AC97 / ICH".
Tested to NOT work with SBLive "emu10k" unfortunately.
- To 'celebrate' the newly working audition feature :-P, also improved
(restored)
the layout of the system buttons. Almost back to what they used to be,
except of course we're still missing the "Help" button, clobbered (thus
far)
by the "Audition" button, until we decide what GUI form the Audition
feature should have.
- Fixed the "adopted tracks have exagerated countdown time" bug.
The progress-bar that is displayed is kinda perfect now (i.e. it starts
"within range",
just like it should be, mimic'ing the one from SoundPlay itself).
- Also improved the looks of the progress bar for "shift-spacebar'ed
tracks"
the same way (no longer arbitrarily offset to zero, they start "within").
- In the process of fixing those bugs, found ANOTHER one (ouch) in class
PauseProxy:
silly me, the "skipThatManySeconds" value was interpreted as
microseconds, even though
it was expressed in seconds... This bug might have impacted several
features...
anyway it's gone now.
- Changed the "start at exact place" keyboard shortcut, from
Command-G to SHIFT-Space.
- Modified the "start at exact place" feature so that, when invoked from
the keyboard,
it will recalculate the event-cursor (rather than assume it to be
correct).
3.1.2 (2007 07 17):
New features ? Ya want new features ?
- Fixed the "suicide" (ASSERT() statement)
in ActiveEventProxy::removeEventLineFromGuiModel())
upon NULL node value: 'node' might indeed be NULL when an event dtor is
called
after scratchAllReferencesToDefunctPlayer() has been called !
- Fixed the "pesky drag n drop" bug: in BlockyElem.cpp,
fixed a stupid (beginner-programmer-grade)
lack-of-variable-initialization bug,
which led to BlockyElem's starting a DnD session "out of the blue" when
hovering
the mouse pointer over them while e.g. using the Big Volume Slider.
- Implemented TrimStart and TrimEnd !
Felt very natural to code now that the code makes it easy to
add that kind of feature. Trimming is now completely transparent
to the rest of the code, i.e. its "maths" are done first, all the rest
(Segues ..etc) second.
TuneTracker now deals with those two BFS attributes, of type "float":
"tunetracker:trim_start"
and
"tunetracker:trim_end"
I've tried this new feature on "BeOS talking blues" (which is 10 seconds
too long
for my taste) and another mp3 (which has too much silence at the
beginning), and it works very very well indeed!
Needs testing...
- Reboot recovery: the "under the hood" part:
In App.cpp / case kBRS_START_CURRENT_NEXT2PLAY,
replaced the call to StartActiveEvent() by
a call to StartActiveEventAtExactRightPlace() (depending on the user
preferences).
Needs a bit of testing..
- Talking of user preferences, here's for Reboot recovery and ProgramLog
loading in general:
- PrefsWindow GUI: got rid of the checkbox with these strings:
"Resume at the "exact best place""
"super_granular_cursor_auto_placement"
"Start at the one line within the hour that is the most "precise" as per
simulation, rather than a rough time-corrects-based approximation."
- Instead, replaced it with a combo box that provides not two, but three
options to the user.
3.1.1 "Two Tricks Pony" (2007 06 28):
And it's the start of another developement cycle!
This pony learned 2 new tricks: real-time awareness (prototype code)
and audition (even less polished code yet..)...
I'm not proud of the code advancement at this stage, but the
first trick of the two is poised to improve some day, I'm sure :-)
- GUI / Prefs: Added a discrete little "audition" combo box in the last
Preferences page.
- Added an "Audition" button in the main window; this messes up the
layout
real bad (and "disappears" the Help button), but is only temporary
for experimenting purposes, no worry :-)
Though anyway, Audition always fails here with whatever soundcard I try,
with a BSoundPlayer error ("no mixer") :-(
This very much seems to be driver related, since I also failed to
establish
the connection to the driver when using the BeBits.com utility "Cortex",
in all but one instance, which seemed to have been a "freak success"
anyway.
So I'm leaning towards this explanation:
it seems that instantiating the sound-card drivers as "warm start" fails
to initialize the hardware properly most of the time ?! We're fooked :-(
Anyway try it out with some other soundcard [drivers], just in case
one of them is more "warm-start friendly" as the SBLive one
and the AC97 one I have here.
- Made a moderate (to the user) but very important (to me, coding-wise)
change in the behavior of TT when a program-log is loaded up: TT will now
position the cursor, not on the NEXT song that ought to be played
"later on", but on the one that ought to be playing right now. This was
of course necessary before implementing the below feature.
Unfortunately this piece of code doesn't work very well if the real-time
cursor is positioned on a #pause-for/#interrupt combo. Will be a PITA to
fix.
But anyway here we are with a prototype, which works fine in other
scenarios
that I could test:
- REAL-TIME AWARENESS:
implemented for physical events, for switcher events, URL events.
I've only tested it with physical events, but all should work equally.
The "Seek()" (cursor-within-cursor positioning) operation is decided at
the
very time when you hit the Command-G keyboard combo, meaning that you
have quite some time before the launch of TT and the hitting of
"Auto On" and the like, before the current-song becomes invalid
(outdated).
Even when the user does an "outdated" real-time-start request,
TT will not freak out but simply do a best-effort attempt
(i.e. start at zero or start near the very end, depending
on which way has the user been unreasonable).
- Wired "Command-G" to the above "real-time start" feature.
- Prefs window GUI : "retired" the "restore previous program log queue"
preference. TuneTracker will now _always_ apply persistency
of the queue. (internals: that prefs used to have the
string values: "Restore program log queue",
"persistent_proglog_queue",
"Save the list of Program Logs whenever modified and restore it again at
startup." )
3.0.26 (2007 04 09):
No problem with Dane needing a build to show off a bit for
those customers who are 'taking our pulse', I just happen this very evening to
have fixed a couple features/bugs so it's a good excuse to do it!
- Changed the button graphics ..etc, using the new "gradient" ones from Dane.
- ToneTracker: Modified the BQuery code in relay-triggered HotTracks so that we have case-insensitive querying, on the "what attribute value field".
- Modified BlockyElem::MouseMoved() so that "Get song info" will be triggered upon extended-touch-display, and not the pop-up-menu as previously.
This will also save me the trouble of having to debug the DnD-occurs-at-the-same-time bug which seems to occur at times.
- Did some behind-the-scenes cleaning up of the sources. Stil more to do.
3.0.25 (2007 04 03):
Dumb me! Fixed the issue du jour, I think :-)
- Fixed the 'suicide' in ToneTracker's relay-triggered Hot-Tracks:
Dumb me! I had made it a 'suicide condition' when ToneTracker failed
to pre-load a track, even though this ought to actually NOT warrant a suicide, since
this may in fact happen very easily:
the "rotation" parameters just have to be invalid (i.e. yield a query that yields nothing)
for this problem to occur !
Lesson learned -- ToneT will no longer bring down the app any more for this
now, but instead will print something in the ReportLog going like :
21:10:46 ** ToneTracker ERROR: in function Trigger() of latch-relay-handler:
pre-loaded track occurs to be uninitialized/misinitialized ! Most likely error is that we couldn't
rotate with those settings: queryAttrName=Audio:Genre and queryWantedValue=Bl___ues.
[ Looks like I'm not done with HotTracks yet, though, Dane also mentionned
this: --HotTrack events are also not entirely "invisible to the GUI."-- ]
- Disabled printf() debug dumps in ToneTracker, will be a while
before we need them again I guess.
- GUI / Clock and weather: Restored the 10-pixels padding to the right of the clock,
so that this row of the GUI looks symmetrical (same padding on the BWeather area
at the left and on the clock to the right).
- GUI / Event-lines look and feel: introduced some new "drag threshold" code,
so that it's easier to open the pop-up-menu with a touch-screen:
the "drag" part of the drag-n-drop session will now only be triggered
by above-4-pixels pointer moves, otherwise it's the pop-up-menu that
gets triggered.
3.0.24 (2007 03 31):
Ramp countdowns, universal overlap and touchscreen-friendly pop-up-menu are
on the menu !
- GUI / Event-lines / Pop-up-menu: modified the "Get song info" label so that it's appended
with an ellipsis (triple-dot). At first this sounds like a bad idea (not compliant with the
Be GUI Kit style-guide) but in fact it's consistent with what we do elsewhere,
i.e. the "Help..." menu item is similar.
- GUI / Event-lines display: modified the "Ramp:" label code, so that the displayed
time actual "counts down" when the event starts playing.
- Segues: modified the BFS-attribute retrieving code so that
a file that does not have a Segue-In, gets treated exactly
as if it had a Segue-In of [whatever value is configured for "Normal Transition"
in the Preferences], and same thing for Segue-Out.
Which means that Universal Overlap is back !
- Enlarged the BWeather area, as much as I could without
sacrifying the Time display. Did this by shortening the Time display
harmlessly, which was done by ... 1/ removing padding on the right
2/ removing padding on the left.
Let's see how it goes; it this is still not enough, we'll have to get rid
of the "seconds" part of the Time display or something like that, which will
give us 3 more characters... Or maybe reduce the font-size of
the weather display itself..
- Modified BlockyElem::MouseMoved() et alia to be NetPositive-style,
i.e. so that one may trigger
the pop-up-menu of a blocky Event-Line by holding the left mouse button for
two seconds. Which means that it ought to work also with TouchScreens,
"Get event info" feature included !
Also modified the older "drag n drop Event Line" code so that it is only triggered
when the mouse starts moving now -- which ensures the older DnD code won't
interfere with the new Netpositive-style code.
- While not directly addressing head-on the "relay bug" entry in the Do-List,
I've tried re-enabling the "restartPlayer()" call in EventsModel.cpp.
From where I stand, this seems to get rid of the soundplay "can't connect"
error alert, and to also get rid of the "no file" track within soundplay;
Dane will probably want to experiment and tell me if this is throwing
the baby with the bathwater, or if it is a workable solution...
3.0.23 (2007 03 17)
- Added a global TTCC hot-key for a new look-and-feel feature: the "Enter" key now
acts as a toggle to shrink/expand the lower-right Text View.
(also works with the "Return" key, as a BeOS free 'feature'...). Tested, works fine!
- Added SEGUE code, based on attribute names
"tunetracker:segue-in" and "tunetracker:segue_out".
It's a fairly simple implementation right now, no bells and whistles:
when the attribute is not present on a given file, TTCC does not
attempt to "guesstimate" the segue value based on another attribute or anything like that -- which
means that attributes-less files will have zero overlap at all... TEST RESULTS: Works nicely for transitions. Need to re-institute universal overlap. Panic doesn't completely do its job on breaking away from a cut that has segue transition marked. Song keeps playing. Also I am seeing some instances where a "non-song event" seems to sit and do nothing for awhile and then advance. I'll try to figure out what is causing that part, but it first appeared in this build, I think.
- GUI / Event-lines / pop-up-menu: added a "Get song info." item,
that retrieves the "Audio:Info" field of the concerned event
and loads it up into the lower-right Text View. Tested, also exactly right! Let's add two more dots to the end of the option in the right-click menu, as in "..."
3.0.22 (2007-03-10)
Fixes again...
- PreferencesWindow/Misc pane: Fixed the path for launching Pe, as set into the combo
box from within PreferencesWindow.cpp, from "RealPlayerTuneTracker System" to "TuneTracker System".
- PreferencesWindow/Switcher pane: Changed a label string
from "Permanent connection (default TuneTracker channel)"
to "Reserve switcher channel for Command Center audio"
- Fixed a stupid bug w.r.t. performing Relay-triggered-hot-tracks:
LatchRelayHandler::Trigger() was dumbly deleting the "current playing"
at the time of the pre-loading of the "pre-loaded", hence nothing
ever played (nothing was ever "current" for any significant time of
more than a few milliseconds).
- Fixed the "SP at front" annoyance:
ever since the HotTracks "preload optimization" started, SoundPlay
is "instantiated" twice (as a 'proxy' within TuneTracker, at least),
meaning it is brought to front even after the main GUI has been created;
I have now supplemented the proxy code so that it does a "pull
TuneTracker to front" call, so that TT eventually wins the tug of war
for user attention :-)
3.0.21 (2007-03-08)
Adding new and fixing old stuff...
- Re-enabled the "debug print-outs" of ToneTrackerLooper.cpp
so as to diagnose Dane's /dev/ports/usb0 troubles...:
It would seem that with the zeta 'exotic' usb-to-serial driver,
* the BT-box silence-sensor is broken,
* using a hot-button like "route input 1 to output 1" no longer works..
In fact, only incoming relays are still performing correctly.. ?!
- GUI / Prefs Window / "Switcher" pane: Added a combo-box that allows to pick up
which serial port to use, so that Dane may switch back to the old "pure serial"
connection and check that the BT box STILL WORKS AS it is supposed to
when using a non-exotic 'real' serial connection to it :-)
We will then know if TT has regressed, or if it's the usb0 thingy itself
which is the culprit...
- Added the necessary logic within EventsServer.cpp and EventsModel.cpp so as
to make ToneTrackerLooper.cpp use this new preference (shutdown and re-start
ToneT whenever the value changes ..etc).
- GUI / Prefs Window / "Misc" pane: Added a (hardcoded, first-in-line)
entry in the "select editor" combo box, like
"/boot/apps/TuneTracker Systems/Extras/Pe/Pe" .
TuneTracker will know to "launch by path" instead of
"launch by signature" when the user selects this entry.
- Quick (and supposedly CLEAN!) fix for Relay-hotTrack, yet with no "GUI fix" yet:
The issue is -- currently, once I queue up a track for future replay, I "detach" the C++ object from the track.. Because I "know" it will be handled (cleaned up) as necessary, by the GUI... But this "know"ledge is bogus currently !!
They only WANT one thing to fire when there's a relay. Multiples would be an evil menace from Mars
So if I no longer detach, then it makes things easier -- I keep full control of the "life cycle" of the track, never forget to clean it up when needed.. But there can be only one track per relay closure, on the other hand.
--> though it also means that if an #ignore statement comes up, the currently-playing track will be ejected..
3.0.20 (2007-?)
A quick build to try out usb0...
- Commented-out the debug output from ToneTrackerLooper.cpp again.
- Hardcoding "usb0" instead of "serial1"
3.0.19 (2007-02-27)
Tweaking, refining, fixing, you name it! Also cleaned-up EventModel.cpp a bit.
- Minor fix: slightly improved the wording of the reportlog error message
about "cannot write so and so next-to-play textfile".
- Commented out the restartPlayer() call within
PlayerState::SetSecondaryAsAutomatedEventWithProps().
That way, SoundPlay will no longer be killed/restarted when
a track affectation fails.
- Modified the display of Switcher event-lines so that
they no longer show the (ever-blank) "Running Time" and "Ramp" labels.
- Improved the robustness of the "Update Web Site" feature
that is to be found in the PreferencesWindow's "log" tab:
if the ascynhronous-exec ampersand is not there, it is now automatically
appended to the string that is passed to ::system().
This will prevent the main thread from being unresponsive to the
other threads within the app.
- Tweaking of Ramps timing: modified AudioFile::OnRamp()
and AudioFile::OffRamp() so that, instead of returning the read attribute
straight from disk, they return "attribute plus 500 ms" instead.
- While doing a code review of ToneTrackerLooper.cpp,
fixed two bugs, one in Unset() (most likely unrelated
to Dane's pains with hot-tracks) and one in SetAsHotTrackCreator(),
which could very possibly be the cause of the bug.
- Just in case, enabled Debug Output within ToneTrackerLooper.cpp,
will need Dane to do a "capture" of the Terminal output (as short as
possible as always in this case :-) produced during the execution
(or rather, lack thereof) of HotTracks...
- GUI / PrefsWindow / Broadcast ops:
created a new "Text Editor App" combo box to configure
which app to choose for the "Open Program Log with..." file-editing feature.
It allows to pick any app installed on the system that knows
to handle the "text" MIME supertype.
The fact that TTCC no longer hardcodes a particular app sig (e.g. BeOS StyledEdit)
will be especially useful to Zeta users, whose sigs seem to be changing of late...
Also to add some "polish" to this feature, made sure that any error that occurs
when invoking the BeOS roster will be displayed in red in the modular "text box".
- Also while working on the prev. feature, realized that the old
"show an error message when encoutering a syntax error
while parsing the log" thingy, could be improved: instead of
launching StyledEdit, it will now display a red error message
within the modular-text-box.
3.0.18 (2007-02-11)
Some fixes, improvements, optimizations, oh my ! I've got yer build right here :-)
- Commented out the printf()s in BBitmapButton -- though didn't
outright delete them, in case we need them later.
- Re-enabled the ShuttlePad button code, which I had
purposedly disabled/broken for TouchScreen testing purposes.
Beside the message-filter workhorse, also re-enabled the SetTarget() call.
- Fixed the "app suicide" happening when TransitionEngine::StartActiveEvent()
is called on some oddly-configured program-logs: had already removed
the other case, happening when the log is non-existent or outright empty,
and now went at it liberally the whole way (!) and made sure
this function will never ever get pissed off now, no matter what is thrown
at it -- indeed, most oddball-states are not due to an internal bug, but
simply due to user errors, and thus should not be "punished".
- Regression that happened a few weeks ago:
Whatever automated track(s) were active within SoundPlay used to be killed
when TTCC would be shutdown cleanly: fixed that. Turned out to be
a one-line fix (love when that happens! increasingly does, for that matter).
- Pre-loading: Optimized the performance of Relay-HotTracks... at the expense
of their "GUI side": lemme 'splain,
TTCC's "ToneTracker" thread is now leveraging class
"LocalFileEventProxy" to pre-load HotTrack, since the EventManager class
does not allow for this -- but this means the GUI is no longer updated
(the event does not appear in the listview when it starts playing).
2f1
Maybe this does not matter, because users don't care that
those particular kinds of HotTracks are not visible in the list ?
Will wait for feedback before doing head-scratching as to how to fix this...
Meta
This section discusses this very document.
Update Policy / Exclusive Hours: Cedric commits to only ever uploading this document between 7 PM and 2 AM C.E.T.,
meaning XXXXXX Wisconsin Time :-), meaning that Dane can freely upload changes outside
this time window and be clobber-risk-free -- likewise, Cedric may assume it is safe to download the
latest version at 7 PM, work on it off-line, and upload the modified version before 2 AM, since he knows for
sure that no (potentially clobbered) changes will have been performed in the meantime.
Colors scheme: we'll use the following guidelines when it comes to colors:
Cedric uses dark blue text (using the <font color="blue"> HTML tag) when he wants to highlite something special to Dane. Dane uses dark red text when he wants to hilite something for Cedric to notice.
General: indeed all dates must be in the yyyy-mm-dd format (e.g. 2007-02-28) :-P, otherwise we risk confusion (esp. on Cedric's side) -- either that or, at least, the e.g. 2007-Feb-28 format (letters instead of digits).
Since the Todo list is our master list of priorities, let's include "fix-mes" in the list too...because sometimes a fix needs to happen even before a new feature gets added.
|