4eba86b503
Fix libwebsockets compat
...
LWS_CALLBACK_HTTP_CONFIRM_UPGRADE is only available since v3.1.0
2020-02-27 23:58:00 +01:00
Luciano Iam
ef512d412d
Avoid occasional response delay when handling HTTP in the websockets surface
2020-02-27 03:42:54 +01:00
Luciano Iam
0921cf8939
Make previous commit 81ecc2b compatible with libwebsockets==2
2020-02-27 03:42:54 +01:00
Luciano Iam
ec8e0f8ee5
Gracefully reject HTTP requests reaching the websockets surface
2020-02-27 03:42:54 +01:00
61b6b740bc
Fix deadlock, shared_ptr d'tor called from ScopedConnectionList d'tor
...
See https://ardour.org/styleguide.html #10
https://pastebin.com/gJfrNhL2
2020-02-25 22:55:59 +01:00
1074c16299
Websockets: error on unhandled callbacks
...
This prevents unhandled http request from hogging the backend.
2020-02-24 22:06:15 +01:00
bd00db9e8b
Websockets: use established NDEBUG - see assert(3)
2020-02-24 22:06:15 +01:00
bf649cd68a
Fix another websocket surface crash when no panner is available
...
This amends 224be91211
2020-02-23 19:12:26 +01:00
8b092f8658
Websockets: use unique header guards
2020-02-23 16:21:55 +01:00
5e3480ba8f
NO-OP: Re-indent websockets code
...
"Always use Tabstops for block-indent (the code must be
formatted correctly with "[TAB] = N spaces" for any value of N).
Use space only for alignment." - https://ardour.org/styleguide.html
2020-02-23 16:21:55 +01:00
224be91211
Fix websockets surface crash when panner is not available
2020-02-23 16:21:55 +01:00
3e77680a57
surfaces transport hotfix: surfaces should query the transport state via BasicUI, when possible
2020-02-23 09:02:25 -06:00
276baee8ad
surfaces transport hotfix: BasicUI: prefer actual_speed() and transport_stopped_or_stopping() for current Transport FSM
2020-02-23 09:02:21 -06:00
8efb642c46
surfaces transport hotfix: actual_speed() is preferred over transport_speed() for current Transport FSM
2020-02-23 09:02:13 -06:00
7fdc35bb45
Fix Unix compile with older libwebsockets
...
Debian/Ubuntu still only ship libwebsockets 2.x.
Recent libWS abstracts the poll interface to be
compatible with Windows.
2020-02-22 23:27:08 +01:00
Luciano Iam
d7ef188aea
Prefix events with LWS_
2020-02-22 23:10:25 +01:00
Luciano Iam
5abce5aae5
Properly initialize IOCondition in events_to_ioc()
2020-02-22 23:10:25 +01:00
Luciano Iam
7f73cfb36e
Properly initialize lws config structs
2020-02-22 23:10:25 +01:00
Luciano Iam
047b05b860
Remove all initializer list usages
2020-02-22 23:10:24 +01:00
Luciano Iam
bb448080b6
Remove locally defined classes
2020-02-22 23:10:24 +01:00
Luciano Iam
d8d70adab8
Replace C++11 lambdas with functors
2020-02-22 23:10:24 +01:00
Luciano Iam
6e499e2cc5
Make code adhere to C++98 (WIP)
2020-02-22 23:10:24 +01:00
Luciano Iam
8db9755d1e
Add websockets surface module
2020-02-22 23:10:24 +01:00
57598acbcf
remove unused members
2020-02-20 12:53:57 -07:00
2398f6127f
fix up apparent design thinkos in US2400 key binding handler
2020-02-20 12:53:57 -07:00
444ef73c7d
fix up apparent design thinkos in Mackie key binding handler
2020-02-20 12:53:57 -07:00
938e65f12a
use MIXBUS approach to User button for Faderport (it's just a button, not a modifier
2020-02-20 12:53:57 -07:00
b5f2aed234
Faderport(1): fix pan_azimuth direction by setting Rotary flag.
2020-02-20 12:25:51 -06:00
ef5fddd8b5
MCU: fix pan_azimuth direction by setting Rotary flag.
2020-02-20 12:25:51 -06:00
43bed39d30
Reset MIDI-control when a given ctrl is not available
...
This fixes an issue with "/route/eq/freq/0 S1":
When a newly select strip that does not have a EQ
(e.g. mixbus or master), the control from the previously
selected strip is used. -- Reported by tavasti on IRC.
2020-02-20 19:13:58 +01:00
Jan Lentfer
d7fed7c52e
LCXL: make sends assignable for 32C
...
* add an option to the controller configuration gui
to assign the 3x2 send banks in mixer mode
to either the upper (1-6) or lower (7-12) Mixbus sends
* This was a user request to better support the workflow
of the CoMondo Mix system
2020-02-13 18:32:41 +01:00
Jan Lentfer
b9b6a57245
LCXL: fix pan for Mixbus device mode, too
2020-02-13 09:53:38 +01:00
7e25298721
FP8: fix direction of panner bar on scribble-strip
...
(amend 4f90bd6298
, see also c663a2d8ef
)
2020-02-13 03:13:30 +01:00
3cb4678bb3
FP8: don't send non-ASCII chars to scribble-strip
...
In particular the degree sign (\u00B0) used by Mixbus' panner
caused issues.
2020-02-13 03:12:14 +01:00
Jan Lentfer
260e7ad5a9
LCXL: Make the pan fix nice again
2020-02-12 21:37:52 +01:00
c321bc82bb
FaderPort8: Don't lock shift, when using shift + encoder
2020-02-12 20:31:10 +01:00
4f90bd6298
Fix Faderport 2/8/16 pan azimuth knob direction
...
See also c663a2d8ef
2020-02-12 20:12:08 +01:00
Jan Lentfer
cc7eca7453
LCXL: Adopt pan knob behaviour
...
* "left/right" changed in A6, adopt for this
* add a pick_up_rev function to honour this
2020-02-09 23:34:20 +01:00
06b2eb1c27
Explicitly use OSX
...
Previously this was inherited via PBD.
On MacOS/X, this adds
"-undefined dynamic_lookup -flat_namespace"
and various "-framework .." options to linkflags
Without this flag, .dylibs fail to link usually because
of missing `-lintl` (Undefined symbols: "_libintl_dgettext")
On other systems this is a NO-OP:
CFLAGS_OSX, CXXFLAGS_OSX and LINKFLAGS_OSX
are only set on the darwin platform.
2020-01-25 04:07:41 +01:00
David Runge
2e9ac80e99
Towards waf python 2+3 support
2020-01-25 04:07:37 +01:00
47767738b9
rename DoTheRightThing to RollIfAppropriate
2020-01-18 08:49:18 -07:00
3c00048b0c
Session::request_locate() takes a tri-valued second argument for "roll-after-locate"
...
This allows callers to defer logic about auto-play/current rolling state and more to TransportFSM where it
can be cnentralized and is less ambiguous
2020-01-18 08:49:18 -07:00
baf0cdcbef
fix handling of flags in the OSC input handler
...
Some builds of glib on macOS end up delivering IO_PRI when IO_IN is also set. This differs from our own build stack
version, but it isn't really an error, so we should handle it.
2020-01-05 11:25:36 -07:00
d100c92731
convert GenericMIDI into a real control protocol module, with its own event loop and ports
2019-12-31 12:06:14 -07:00
007136cc23
remove MIDI Control input and output ports from session-level objects
2019-12-31 12:06:14 -07:00
60ccbcf9cc
use a local version (copy) of the G_SOURCE_FUNC macro, since it is not available in the GTK+ version we use for the official build stack
2019-12-30 09:49:23 -07:00
3ee08bbae7
Revert "fix a cast warning (as recommended in GTK+ docs"
...
This reverts commit af30a6f001
because it breaks OSX/MacOS builds:
libs/surfaces/mackie/mackie_control_protocol.cc:945: error: 'G_SOURCE_FUNC' was not declared in this scope
2019-12-30 16:00:22 +01:00
d79d2807b1
expand use of new BasicUI API for transport button state to all control surfaces
2019-12-29 18:53:22 -07:00
52aa405ce3
use new Session API to deal with transport state
...
Transition to use BasicUI button state API to come
2019-12-29 18:43:51 -07:00
e46e6f12a3
use new BasicUI and Session API to deal with transport state
2019-12-29 18:43:51 -07:00
a8cc5b1303
provide new methods for BasicUI that wrap the "complexity" of how to show transport state via lit buttons
2019-12-29 18:43:51 -07:00
af30a6f001
fix a cast warning (as recommended in GTK+ docs
2019-12-29 18:43:51 -07:00
d4e023e1cb
Make BusSendLevel 1st class citizen (1/2)
...
Equivalent to Gain and Trim (gain-coefficient, not dB) and use
it for Sends.
2019-12-14 15:06:23 +01:00
941aa20148
Fix font size on Push2
...
At least on my machine, the fonts on the Push display were ridiculously large,
making everything overlapping and unusable. I suspect this is because
pango_cairo_font_map_get_default() inherits DPI from the system, so the
monitor scaling factor got applied to the Push display as well.
This commit instead creates a new plain font map, and sets the resolution to
96, which looks like what the UI was designed for. Some more tweaking of the
Pango context might make things more optimal on the Push, but just setting the
resolution makes things look reasonable to me anyway.
2019-12-09 23:38:10 +01:00
8ec3e5fb54
Fix deprecated-copy warnings
...
It's long been a guideline (and IIRC a Weff-c++ warning) that either all, or
none, of the copy methods should be defined, but this became a standard warning
in GCC9. Presumably to account for a later language change though I'm not sure
which.
I don't remember why the ChanMapping copy constructor can't just be a simple
copy (it's just a map of POD), but figure it's safer to just copy what that
does.
2019-12-09 23:25:59 +01:00
7b25a89944
part 1 of replicating semantics of ARDOUR_UI::toggle_roll() in BasicUI::toggle_roll()
...
This can be done better, even without sharing code
2019-11-02 16:32:18 -06:00
a855119bdd
rename all Evoral source from .(hpp|cpp)$ to .(h|cc)
2019-11-02 16:32:18 -06:00
a072228de5
remove seamless looping as an option (it's now the only kind of looping we support)
2019-11-01 14:04:28 -06:00
496e6f2a4c
New implementation for single-fader mackie devices (reverts b96d8e)
2019-10-22 14:39:38 -05:00
b96d8e7ffa
Add support for single-fader MCU devices: XTouch One and RuCo. (needs testing)
2019-10-20 22:24:32 -05:00
d10c4c651c
Consolidate and extend "well-known" controls:
...
* Add new common strip controls (inspired from Mixbus)
* Remove duplicate documentation, document virtual API only.
* "azimuth" not "azi"
2019-09-25 14:02:45 +02:00
09acad190b
Faderport: use well-known-controls API
2019-09-25 14:02:45 +02:00
e0d5c1426c
NO-OP: fix some Wimplicit-fallthrough
...
gcc can recognize various regexps in comments. Since C++17 provides
[[fallthrough]], using /* fallthrough */ consistently seems
appropriate until we switch to C++17.
see also https://gcc.gnu.org/onlinedocs/gcc/Warning-Options.html
2019-09-18 17:37:54 +02:00
52021bc3ca
Consistent use of abort() /* NOTREACHED */
...
This fixes some static analysis warnings:
PBD::fatal transmitter needs to be connected to a function
that aborts. This is usually the case with GUI
2019-09-18 05:57:26 +02:00
66ceb2b3c7
NO-OP: whitespace
2019-09-06 20:43:20 +02:00
33c251a623
Fix MSVC compilation
...
This resolves a circular dependency:
libardour calls methods from libardour_cp and vice versa.
Since 9bb2f2bb
libardour is also calling active() and that method
needs to be forced to use late binding. -- compare to b9bbea7174
2019-09-06 20:35:49 +02:00
212b445628
Shuttle Surface: handle libusb_init() failure
...
USB stack may not be available on some systems, e.g. unit-test VM.
When libusb_init(0) fails to create default context, further calls
into the libusb API will cause segfaults.
2019-09-06 01:37:00 +02:00
97306e089b
Fix thinko/typo bug introduced in e6c9bcfd07
2019-09-05 14:56:39 +02:00
f7968f15dd
LCXL: Fix uninitialized pointer function
...
See also 026b74e25d
. FilterFunction must point to a valid function.
2019-08-24 00:01:28 +02:00
026b74e25d
Fix potential call of uninitialized pointer function
...
_template_number can be set via sysex to an arbitrary number, this
can lead to calling a filter-function at an undefined address, usually
a segfault.
2019-08-21 03:53:46 +02:00
c38c91ddbd
Initialize variable, fix branch condition
2019-08-21 03:09:32 +02:00
e6c9bcfd07
Prefer to use API defined return status
2019-08-21 03:06:28 +02:00
df60eca33c
Initialize uninitialized variable
...
This fixes a potentially undefined branch if the USB device list is empty.
dev is NULL, the loop is never entered, 'r' isn't set.
if (!dev && !r) is undefined.
2019-08-21 03:05:17 +02:00
6227dd5b04
Shuttle Surface: Fix uninitialized argument in case of incomplete state
2019-08-20 04:18:43 +02:00
df2917568d
OSC: foldback buses should be able to be mono
2019-08-06 11:12:19 -07:00
365f6d6337
Update plugins/addons GPL boilerplate and (C) from git log
2019-08-03 15:53:18 +02:00
43fe5c0487
Update Push2 level-meter display (use new API)
...
The meter-type is now implicit set by route/meter-processor, common
to all UIs.
2019-06-09 19:56:33 +02:00
Johannes Mueller
af875e0edc
Potential fix for a race.
...
Do proper bounds checks and force the use of operator[] () const
2019-05-30 17:33:36 +02:00
Johannes Mueller
16d6791566
Make ContourdesignControlProtocol::_button_actions private again ...
...
... and add proper bounds checks.
2019-05-30 17:09:33 +02:00
203b249135
Shuttle Surface: fix linking .dll
...
For .dll, all references need to be defined at compile/link time
(not runtime). ie. `ld -zdefs`
2019-05-26 12:46:37 +02:00
d28dc9ee08
Shuttle Surface: request_factory and MSVC compatible struct
2019-05-25 16:49:19 +02:00
3546a7291b
Shuttle Surface: Fix C++ style: use accessor/setter methods
...
This also fixes C++ compat: no forward declaration of friend classes
(OSX compilation) and C++98 compat (enums are not classes e.g. ActiveState)
2019-05-25 16:49:15 +02:00
Johannes Mueller
e61c4b692b
Use ActionModel also in ContourDesign surface
2019-05-19 16:43:48 +02:00
Johannes Mueller
0c3112aed1
Some frame -> sample changes in UCS2400
2019-05-18 16:36:49 +02:00
Johannes Mueller
b8349069f1
Add support for contourdesign ShuttlePRO v2 and ShuttleXpress
2019-05-18 14:04:38 +02:00
Johannes Mueller
89f39d14f2
Add some options for surfaces to jump in the timeline
...
* ::jump_by_beats()
* request transport to keep rolling after jump
2019-05-18 13:27:49 +02:00
3e7e89db8f
Fix some actions that moved from Common to Editor.
2019-05-13 09:20:17 -05:00
9ac18a8e0f
Generic-MIDI ctrl: tweak pitch-bend message behavior
...
Add support for smoothing, ignore message when controllers are
not in sync to avoid discontinuous jumps.
This is mainly useful for Mackie-like devices that use pitch-bend
messages for faders.
see also https://discourse.ardour.org/t/feature-lazy-sliders/100961
2019-05-09 16:06:00 +02:00
5bde8f4456
Tweak initial generic-midi sync/smoothing
...
"last_controllable_value" is using midi value range (0..127).
It is used to compare received midi-value with the actual controllable
for non-motorized surfaces, and this change allows the first
event to already be in_sync.
Previously the first MIDI-event was usually ignored (because
last_controllable_value was out of bounds or didn't match the 0..127
range.
2019-05-05 02:49:53 +02:00
Johannes Mueller
ce47ec411a
Make use of ActionModel::build_custom_action_combo()
2019-04-20 22:36:51 +02:00
Johannes Mueller
73f8b8d982
Use ActionModel::build_action_combo() for Control Surfaces that need it
2019-04-20 15:25:32 +02:00
Johannes Mueller
5b7bcec529
Use ActionModel API in the Control Surfaces that can make use of it
2019-04-20 15:25:32 +02:00
Johannes Mueller
8cbbd3dd00
Fadeport: Fix User button state save and restore
...
Since we (since ddfc37e4
) set the UserDown flag for the User button actions, we
need to set it also when we lookup actions when saving the state.
Furthermore, we need also look for the UserDown flag, when we set the state
of the configuration combos for the User button.
2019-04-20 00:15:20 +02:00
Johannes Mueller
23b196952b
Fix restoring of CC121 configuration
...
The button ids are in the children of the cc121 protocol node, not in the
protocol node itself.
2019-04-20 00:12:59 +02:00
2f91bdfa53
NO-OP: <tab> after <space> fixes in libs
2019-04-13 19:19:29 +02:00
a5009bfed3
Indicate automation-latch as "touch" on the CC121
...
Without a dedicated "Latch" control, this does at least consistently
indicate "Touch", rather than show some arbitrary LED state.
2019-04-08 02:05:36 +02:00
eeb2cddd26
NO-OP: indent
2019-04-08 00:29:13 +02:00
4b86d19b27
Add missing semicolon (Mixbus)
2019-04-08 00:22:13 +02:00
925d25851d
Fix OSC crash when there's no master bus
2019-04-03 03:35:13 +02:00
6d335be418
Indicate automation-latch as "touch" on the FP1
...
The FP1 does not have a dedicated "Latch" control, but this does
at least consistently indicate that Touch, rather than show some
arbitrary LED state.
2019-04-01 22:30:16 +02:00
50e8c4d529
Expose Latch automation mode to MCUs
2019-04-01 22:28:07 +02:00
3448f3151e
NO-OP: whitespac
2019-03-23 17:35:26 +01:00
c97116083f
Fix generic-midi controllable race-condition
...
Continued work after e9b36f2bea
. Prefer a shared_ptr<>.
MIDIControllable::write_feedback() runs in realtime context, directly
from the main process-thread. Synchronizing weak-pointers and deletion
across threads does not work reliably. Retaining a shared_ptr<> for
controllables that are in use can solve this.
2019-03-23 16:32:48 +01:00
73029d45ba
Re-add global lookup for generic-midi ctrl state
2019-03-23 04:24:39 +01:00
e9b36f2bea
Update GenericMidiControlProtocol to use shared/weak Controllable pointers
...
This fixes a race-condition when a controllable is deleted
while sending feedback to the device.
Previously there was a race-condition MIDIControllable::write_feedback()
triggered from rt-thread, processed in Surface-thread and deleting
a route or processor.
This is a first step, currently state-restore is not fully functional
session->controllable_by_id() does not cover all Controllables.
2019-03-23 02:09:39 +01:00
baed14c17e
Prepare PBD::Controllable API cleanup (remove only registry user)
2019-03-23 01:41:55 +01:00
9a1c22d7e1
Remove unusued API Create/Delete Binding
2019-03-23 01:28:23 +01:00
acbd12c885
fix all surfaces' available action menus
...
Note: this replicated code is ridiculous
2019-03-20 14:23:23 -07:00
cf2fa0ae84
fix Mackie available action menu
2019-03-20 13:05:35 -07:00
94d859e30d
ActionManager::get_all_actions() no longer includes <Actions> in the paths it returns, part 2 (surface support)
2019-03-20 11:15:34 -07:00
4667ca962b
Mixer/show-editor is now Common/show-editor
2019-03-19 10:42:05 -05:00
a3986f703d
reorder #include directives
2019-03-18 22:58:24 -07:00
7054b2ffc7
switch remaining use of Common/ToggleMixerList to Mixer/ToggleMixerList
2019-03-18 10:58:02 -07:00
Jan Lentfer
dfda5eab82
LCXL:Disable global mute/solo/recarm in device mode
2019-03-06 09:28:25 +01:00
23a98e5f4d
remove references to "Editor_menus" which is an action that no longer exists
2019-02-16 13:12:45 -07:00
56e950b189
rename Main_menu action to Main menu
...
So that if it ever does show up in a list, it looks nice
2019-02-16 13:05:41 -07:00
586792fcc9
NO-OP: whitespace
2019-01-21 14:36:59 +01:00
657e976a80
NO-OP: remove unused code
2019-01-21 14:34:19 +01:00
d97364736c
ISO-C++ compat, see cd70c6bda5
, 91ed9840d
2019-01-21 14:33:08 +01:00
616ee4e43b
OSC: remove unused variable
2019-01-18 10:24:13 -08:00
c7787690f6
OSC: shorten foldbackbus names
2019-01-18 10:24:13 -08:00
cd70c6bda5
Fix ambiguity introduced in 91ed9840d
...
(bool) false == 0 == (const char*) NULL
error: ISO C++ says that these are ambiguous, even though the worst
conversion for the first is better than the worst conversion for the second:
actions.h:92: note: candidate 1: Glib::RefPtr<Gtk::Action> ActionManager::get_action(const char*, const char*, bool)
actions.h:91: note: candidate 2: Glib::RefPtr<Gtk::Action> ActionManager::get_action(const std::string&, bool)
2019-01-16 01:17:52 +01:00
8f9e63575f
Clarify which version of 'ActionManager::get_action()' we're calling
...
For MSVC, the parameter 'false' (i.e. 0) can be considered as either a bool or a pointer - so it'll map to both declarations of ActionManager::get_action()
2019-01-14 14:14:23 +00:00
b67bb8165b
do not crash if an unknown action is used by US2400 support
2019-01-11 12:54:44 -06:00
91ed9840d0
do not crash if an unknown action is used by Mackie Control support
2019-01-11 12:39:07 -06:00
Jan Lentfer
ff0ee75a56
LCXL: Fix a problem in switch_bank
2019-01-03 19:22:56 +01:00
Jan Lentfer
45f83beb17
LCXL: fix special 32C handling for autom. lanes
2019-01-03 19:22:15 +01:00
Jan Lentfer
5d2a03578c
LCXL: some more small tweaks
...
* assign Pan knob to Comp thresh as secondary function
* make cancel_all_solo and cancel_all_mute work in device mode, too
2018-12-12 18:14:48 +01:00
360261f110
replace ::cast_dynamic() with relevant ActionManager::get_*_action() calls
2018-12-12 11:12:48 -05:00
4b0f0f913b
fix Window->Common move for show-mixer
2018-12-10 18:40:16 -05:00
00df619d21
use ActionManager namespace, rather than ActionMap objects
2018-12-10 08:34:01 -05:00
9b2612f686
Make foldback bus match foldback sends namewise
...
to avoid confusion with listener sends or monitor bus
2018-11-12 22:30:32 -08:00
f27ca29d6c
Changed send/deliver role "Personal" to "Foldback" so bus type can match
2018-11-12 22:30:32 -08:00
e9013c0f99
OSC: New personal monitor buses no longer need to be hidden
2018-11-12 22:30:32 -08:00
1b2b3452cb
OSC: logic thinko fix
2018-11-12 22:30:32 -08:00
Jan Lentfer
fb1fe5ce30
LCXL: some final fixes
2018-11-11 19:52:37 +01:00
894145c527
OSC: specify which stiripable type we want
2018-11-07 17:00:16 -08:00
f7b67501a9
OSC: Allow non-cue surfaces to create personal send and ListenBus
2018-10-30 12:15:28 -07:00
777fe3c68f
Add personal monitor sends
2018-10-19 08:51:29 -07:00
897258f5f1
Fix scalar initialization of shared_ptr<>.
2018-10-18 04:15:47 +02:00
5e21b6633d
Option to hide send if aux is hidden
2018-10-17 15:59:00 -07:00
Jan Lentfer
05d3539591
LCXL: complete overhaul and Mixbus support
2018-10-17 15:14:59 +02:00
Térence Clastres
a33a5cdeaf
LCXL: Assign one callback function per Knob/Fader
2018-10-17 15:14:59 +02:00
1b7cb8aec4
OSC: personal monitor can hide the aux bus
2018-10-16 13:56:52 -07:00
87ab15c862
OSC: personal monitor send hidden follows aux hidden
2018-10-16 13:56:52 -07:00
8160fd1348
OSC: personal monitor should only send signal present on change
2018-10-16 13:56:52 -07:00
b35283caa1
OSC: allow personal monitor to add a send.
2018-10-14 21:20:57 -07:00
8ed33f1bc7
remove use of hardcoded -fPIC compiler flag, and use compiler flag dict instead
2018-10-14 22:06:11 -04:00
0f6e67a32f
Faderport(Classic): Add Record-PreRoll and Record-CountIn actions to the footswitch selections. Could make this menu access -any- action, but I think a short useful list of transport items is better in this case.
2018-10-07 10:10:03 -05:00
4c7e5dbc74
move away from "sync source" concepts
2018-10-05 14:15:02 -04:00