TweetFollow Us on Twitter




[IMAGE Ortiz_final_rev1.GIF]

A time base is the heartbeat of a QuickTime movie. It keeps the movie going and tells the Movie Toolbox when to stop and when to display the next frame. This article explores the concept of time bases and shows how you can use time bases to affect the behavior of movies as well as how to use time base callback procedures for timing purposes.

In a basic sense, a time base can be viewed as the black box that maintains the temporal characteristics of a QuickTime movie. When a movie is playing, some of its temporal characteristics are obvious: it has a duration, it's "moving" or not, and so on. Some of the not-so-obvious characteristics that a time base keeps track of are also important, such as the clock that governs the passing of time as far as the movie is concerned and whether the movie is looping.

Time bases are created dynamically by the Movie Toolbox each time a movie is opened, rather than being stored with a movie. Time bases can also exist by themselves, with no movie attached, and can therefore be used to time other dynamic events, much as you would use a Time Manager task.

The QuickTime Movie Toolbox provides a high-level interface that lets you modify all the parameters of a movie, some of which implicitly change its associated time base. Most applications therefore will never need to manipulate time bases directly. Nevertheless, there are situations in which it's necessary to access time bases more directly, such as the following:

  • when a document presents multiple views of a movie and all views need to be kept in sync
  • when you need to take advantage of the callback functions of a time base
  • when you're writing a custom movie controller

This article addresses these situations.


First let's define some of the terms related to the way QuickTime treats time:
  • Time scale: the number of units into which a second is subdivided. For most QuickTime movies, the time scale is set to 600, meaning that the smallest fraction of time measurement for the movie is 1/600th of a second.
  • Rate: the multiplier for the time scale. The rate controls how fast the movie plays. When the rate is 1.0, the movie plays at its normal speed, meaning that for each second of play the movie's time advances a number of units equal to the time scale. If the rate is between 0.0 and 1.0, the movie plays in slow motion, and fewer units are counted off per second of play. A negative rate implies that the movie is playing backward. A rate of 0 means that the movie is stopped.
  • Time value: indicates where we are in the movie being played back. The time value is given as a number of time scale units. When a movie is playing forward from its start, the current time value can be calculated as time elapsed (in seconds)* time scale* rate

You can think of a time base as a dynamic container that holds the following information about a process, normally a movie: the time source (either the clock being used as the master clock or the master time base); the time bounds (the start and stop time values) and the current time value; the rate; the time base flags, indicating different conditions for the time base; and a list of callback routines.

Figure 1 illustrates these concepts and shows how they interact. The figure assumes that the clock or time source ticks at a constant speed; however, you could conceivably use a clock that runs at a varied speed, which would make the movie go faster and slower in sync with the clock.

Figure 1 doesn't show the effect of the time base flags. In QuickTime versions 1.0 and 1.5, two mutually exclusive flags are defined -- loopTimeBase and palindromeLoopTimeBase. The loopTimeBase flag causes the time base to go back to the start time value when it reaches the stop time value (or vice versa if the movie is playing in reverse); palindromeLoopTimeBase reverses the direction of play when it gets to the start or stop value of the time base.

[IMAGE Ortiz_final_rev2.GIF] Figure 1 Time Concepts in a QuickTime Movie


The QuickTime Movie Toolbox is the best mechanism for manipulating movies and their parameters. The high-level calls provided by the Toolbox are all that most applications will ever need. Using graphics as an analogy, suppose that you wanted to draw a complicated image. The easiest way to do this would be with QuickDraw, by calling DrawPicture, but you could also interpret the picture by hand and execute its opcodes individually or even set the video RAM pixels directly! Similarly, when working with a movie, you can work directly with its time base, but it's best to let the Movie Toolbox do as much as possible -- not because it's the only way, but because it's safer, it lessens the chances for compatibility problems, and it's simpler. Thus, for time bases associated with movies, it's best to call SetMovieTime rather than SetTimeBaseTime and to call SetMovieMasterClock rather than SetTimeBaseMasterClock.

For those cases in which it makes sense to access and modify time bases directly (as in the scenarios mentioned earlier), the Movie Toolbox provides procedural interfaces that allow you to do so. The sample program TimeBaseSimple provided on theDeveloper CD Series disc shows how to get a time base from a movie, how to interrogate the time base, and how to change some of its parameters.

Figure 2 shows the window displayed by TimeBaseSimple. This window displays the duration of the time base (in most cases the same as the duration of the movie), a number obtained by subtracting the start time value from the stop time value. It also shows the rate at which the movie is playing, the preferred rate (a value normally set when the movie is created; it will differ from the rate if the movie is stopped or is playing in reverse due to palindrome looping), the name of the clock being used, and the type of looping in effect.

[IMAGE Ortiz_final_rev3.GIF]

Figure 2 TimeBaseSimple Window

Through this window, the user can set the preferred rate, which is the rate the Movie Toolbox and the standard movie controller use to set the movie in motion. Radio buttons allow the user to specify the type of looping via the time base flags. The user can also scan the movie backward and forward by clicking the shuttle control in the top left of the window. This control is included in the sample to show how to go forward or backward in the movie by changing the current time value in the movie's time base.

Before you can begin working with a time base, you have to get it. TimeBaseSimple does this with the following line:

tb := GetMovieTimeBase(gMoov); (* get movie's time base *)

GetMovieTimeBase returns the time base associated with the movie gMoov. The variable tb receives this value.

Getting the clock information. Once you've retrieved the time base, you can get the information about it. TimeBaseSimple acquires the information regarding the master clock in order to display its name in the window. The clock information is obtained via the Component Manager. First we obtain the clock component being used by the time base; then we use it to get the information from the Component Manager.

clock := GetTimeBaseMasterClock(tb);
                                   (* instance of clock being used *)
err := GetComponentInfo(Component(clock), cd, Handle(clockN),
           NIL, NIL);

In the variable cd, a ComponentDescription record, GetComponentInfo returns the type of component, the subtype, the manufacturer, and the component flags. Note that the program could be written to pass NIL instead, because the information received is not used. clockN is a handle in which GetComponentInfo returns the name of the component, which is what we're really looking for.

Note also that when a time base has been enslaved to another (as discussed later), GetTimeBaseMasterClock returns NIL. To ensure there's a master clock associated with a time base,the application should first call GetTimeBaseMasterTimeBase; a NIL result indicates that the time base has a master clock, whereas a nonzero result indicates that a master time base exists that contains the master clock.

Getting and changing the time values. You can get the start and stop time values for a time base as follows:

scale := GetMovieTimeScale(gMoov);     (* first get the time scale *)
startTimeValue := 
    GetTimeBaseStartTime(tb, scale, startTime);(* get start time *)
stopTimeValue :=
    GetTimeBaseStopTime(tb, scale, stopTime); (* get stop time *)

Note that the start and stop times returned are given in terms of the time scale being passed; this means that we can get different values for the same time point, depending on the granularity we require. As a matter of fact, in TimeBaseSimple, when we're preparing the shuttle control, we get the same values but with a different scale:

shuttleScale := moovScale DIV 10;
localDuration := GetTimeBaseStopTime(tBase, shuttleScale, tr);
localDuration := 
       localDuration - GetTimeBaseStartTime(tBase, shuttleScale, tr);

The shuttle control in TimeBaseSimple lets you scan the movie backward and forward. This is implemented by changing the current time value for the time base, which looks something like this:

SetTimeBaseValue(gTBState.tBase, value*10, gTBState.moovScale);
                                (* 'movie scale/10' tick *)

Setting the rate. Although you can obtain the current rate for a time base and set the rate directly, for a time base associated with a movie a better approach is to make Movie Toolbox calls such as StartMovie or SetMovieRate. The Movie Toolbox executes these calls by changing the time base associated with the movie. For example, StartMovie gets the preferred rate and sets the time base rate to it, setting the movie's time base in motion.

When the movie is being controlled by the standard movie controller, it's important to call MCMovieChanged if you change any movie characteristic, such as the rate or the current time value, to keep the controller in sync with the new settings. As mentioned earlier, it's better to use high-level interfaces to enact these changes; for example, to change the rate via the movie controller, you can call MCDoAction(mc, mcActionPlay, newRate).

Using the time base flags. When you access a time base directly, you can set its movie to loop, either normally or backward and forward, by setting the time base flags. GetTimeBaseFlags retrieves the flags for inspection, and SetTimeBaseFlags modifies the flags. In TimeBaseSimple, the SetTBLoop routine sets the looping flags:

(* Changes the state of looping in the movie if needed. *)
VAR     targetTB:   TimeBase;
    targetTB := gTBState.tBase;           (* the movie's time base *)
    SetTimeBaseFlags(targetTB, newFlags); (* change it *)
    gTBState.flags := newFlags;           (* remember new state *)

Now that you've seen how you can access the state information of a time base, let's look at some of the possible uses of time bases.


One interesting situation arises when you need to play back two or more instances of a movie simultaneously. In such situations you can synchronize the movies by enslaving all the instances to one time base. The central idea behind this is to have control of the movie's time flow pass through a single point instead of having a number of individual time bases running at the same time. The sample program TimeBaseSlave on theDeveloper CD Series disc shows how to do this.

TimeBaseSlave splits the window in which the selected movie is to play into four parts, with the quarters rotating while the movie is playing back. Figure 3 shows the TimeBaseSlave window at its four stages of playback.

[IMAGE Ortiz_final_rev4.GIF]

[IMAGE Ortiz_final_rev5.GIF]

[IMAGE Ortiz_final_rev6.GIF]

[IMAGE Ortiz_final_rev7.GIF]

Figure 3 TimeBaseSlave Window at Its Four Stages of Playback

The basic programming strategy is as follows:

  1. Get the time base associated with one of the instances of the movie.
  2. Force the time base from step 1 to be used for the other instances.
  3. Start playing the first instance of the movie, controlling it in any way you like. (TimeBaseSlave starts the movie and sets it back to the beginning when it reaches the end.)
  4. The other instances of the movie will follow blindly.

The EnslaveMovies routine in TimeBaseSlave takes care of all this:

FUNCTION EnslaveMovies: OSErr;
VAR     err:                    OSErr;
            masterTimeBase:     TimeBase;
            slaveZero:          TimeRecord;
            slaveZeroTV:        TimeValue;
            masterScale:        TimeScale;
            count:              INTEGER;
    err := noErr;
    masterTimeBase := GetMovieTimeBase(gMoov[1]);
                              {* time base of first movie instance *}
    masterScale := GetMovieTimeScale(gMoov[1]);
                              {* needed for SetMovieMasterTimeBase *}
    slaveZeroTV := 
        GetTimeBaseStartTime(masterTimeBase, masterScale, slaveZero); 
                                                          {* ditto *}
    FOR count := 2 TO 4 DO  (* slave all movies to first time base *)
            SetMovieMasterTimeBase(gMoov[count], masterTimeBase,
                slaveZero);                        {* now we do it *}

            (* real programmers do check for errors *)
            err := GetMoviesError;
            IF err <> noErr THEN 
                    ErrorControl('SetMovieMasterTimeBase failed');
    EnslaveMovies := err;

Once the slave instances of the movie have been set to obey the first time base, their behavior will mimic the first movie's actions. In the TimeBaseSlave code, it appears that only the first instance is started and that only it is rewound when the end is reached. These actions are accomplished in TimeBaseSlave by calls to StartMovie and GoToBeginningOfMovie, respectively, with the first movie passed as a parameter.

You could use this technique to play different movies but have all of them under a single control. It might also be useful when no movies are involved at all but time bases are being used for timing purposes.


TimeBaseSlave also shows how to take advantage of the callback capabilities of time bases. Callbacks are useful when an application needs to execute given tasks when the time base passes through certain states. You can program time base callbacks to be triggered under the following conditions:
  • when a certain time value is encountered (callBackAtTime)
  • when a rate change occurs (callBackAtRate)
  • when there's a jump in time (callBackAtTimeJump)
  • when the start or stop time is reached (callBackAtExtremes)

Passing callBackAtTime to NewCallBack shows the use of callbacks that are executed at a specified time value. TimeBaseSlave uses the callback service to rotate the movie pieces at regular intervals; we ask to be called every three seconds in movie time.

Note that the time value triggering the callback depends on the rate of the time base. In other words, the time value specified will never be reached if the movie isn't playing (if the rate is 0). If the rate is something other than 1.0 (if the movie is accelerated or is moving in slow motion or in reverse), the specified break will come every three seconds in movie time, not clock time.

First TimeBaseSlave has to create a callback. This could be accomplished as follows:

cb := NewCallBack(tb, callBackAtTime);

Since we want to be called at interrupt time, however, the line looks like this:

cb := NewCallBack(tb, callBackAtTime + callBackAtInterrupt);

The variable cb receives a callback, which depends on the time base tb. The callback will be executed at specific times and can be scheduled to fire at interrupt time.

NewCallBack moves memory, which means that you can't create a callback while in an interrupt handler. Electing to be called at interrupt time has an advantage over normal interrupt-driven tasks, however, as I'll explain later.

Once we're satisfied that the callback was created (cb <> NIL), we proceed to prime the callback. At this point we have only the hook into the time base; priming the callback schedules it to call us. This is accomplished by CallMeWhen, as follows:

err := CallMeWhen(cb, @FlipPieces, callWhen, triggerTimeFwd,
    callWhen, scale);

FlipPieces is the routine that we want to have called when the specified time value arrives. The callWhen variable is passed both as a refCon (the third parameter) and as the time to trigger the callback (the fifth parameter), the idea being that FlipPieces will need to know the current time. Of course, the refCon parameter can also be used for any other purpose you may see fit.

The time at which the callback is triggered is given a frame of reference by the scale parameter. Remember that a time value without a time scale has no meaning at all. Finally, triggerTimeFwd means that our routine will be called only when the movie is moving forward. This is reasonable since TimeBaseSlave plays back the selected movie in forward motion only.

The routine responsible for servicing the callback follows a simple interface and is defined in TimeBaseSlave as follows:

(* CallBackProc *)
PROCEDURE FlipPieces(cb: QTCallBack; refCon: LONGINT);
(* The refCon parameter contains the time that triggers the
callback; this is the value passed to the CallMeWhen routine. *)
VAR     j:          INTEGER;
        callWhen:   LONGINT;
        scale:      TimeScale;
        stop:       LONGINT;
        tr:         TimeRecord;
        tb:         TimeBase;
        err:        OSErr;
    stage := (stage + 1) MOD 4;
    FOR j := 1 TO MoviePieces DO
        ShiftMoviePieces(j);    (* turn the movie pieces around *)
    scale := 100;        (* 100 units in this scale means 1 second *)
    callWhen := refCon + 3*scale;       (* call me in 3 seconds *)
    tb := GetCallBackTimeBase(cb);  (* needed for next line *)
    stop := GetTimeBaseStopTime(tb, scale, tr);
    IF callWhen > stop THEN  (* wrap around the three seconds *)
        callWhen := 
            GetTimeBaseStartTime(tb, scale, tr) + callWhen - stop;
    (* now to really reprime the callback *)
    err := CallMeWhen(cb, @FlipPieces, callWhen,
        triggerTimeFwd + callBackAtInterrupt, callWhen, scale);

TimeBaseSlave does the actual splitting of the movie into different views by creating four instances of the same movie and setting the movie clipping region for each one to be the rectangle in which eachis expected to display. When it's time to move the pieces, the movie box of each instance is offset to cover the next spot. Take a look at SplitMovie and ShiftMoviePieces to see the code.

Inquisitive readers will have noted that when calling CallMeWhen, TimeBaseSlave uses both noninterrupt and interrupt-time invocations. This was done to illustrate one of the advantages of using Movie Toolbox callbacks: the Toolbox takes care of setting up the A5 world when your service routine is called. Having the A5 world set up properly is useful when your program needs to access global variables; other interrupt handlers can't count on A5 being right when they're invoked.

Using time base interrupt callback routines does not, however, liberate the application from the normal limitations of interrupt-servicing routines; for example, you can't move memory.

As mentioned earlier, although time bases are created automatically when a movie is opened or created, they can also exist on their own. If an application requires services that allow control over the passing of time, it can create a time base and use callbacks to trigger the service routines required. Keep in mind that even when a time base has no movie, the application must still call MoviesTask to guarantee that callback routines will get time to run.

Time base callbacks can also be triggered by a change in the rate or by a jump in the time value. A change in the rate occurs when the movie is stopped while it's playing, when a movie is set in motion, or when the playback speed is somehow changed. A jump in time occurs when the current time value in the time base is set to a value outside the normal flow -- for example, when a movie that's playing is set back to the beginning. In addition, QuickTime 1.5 introduces callbacks "at extremes" that can be triggered when the time base time reaches the start or stop time.

These three means of triggering a callback are of interest only if the code is tracking the behavior of the movie, as a movie controller or a media handler would need to do; the constants used for calling NewCallBack in these cases are callBackAtRate, callBackAtTimeJump, and callBackAtExtremes.


If you'd like to play with the sample programs, you may want to try some variations. For instance, it's very easy to modify TimeBaseSlave to have all the movies play at their own beat, with separate time bases, and compare the performance with the original TimeBaseSlave. You could also modify TimeBaseSimple to see the time values obtained with different time scales.

Time bases are an important part of the QuickTime Movie Toolbox. Understanding their role in the way movies play back can be extremely important for developers trying to push the envelope in writing new and innovative QuickTime applications. This article has opened the door; now it's up to you to decide whether this route will prove beneficial to your efforts.


Listed below are some of the more significant features of QuickTime 1.5.
  • Photo CD: Using QuickTime 1.5 and the Photo CD Access extension, you can work with Kodak Photo CDs on your Macintosh. Photos on the CD appear as standard PICT files and can be opened in any application that opens pictures.
  • Compact video compressor: A new compressor has been added that provides high-quailty, low data rate playback.
  • Movie import: Any application that opens movies using QuickTime's Standard File Preview can import PICS, AIFF, PICT, and System 7 sound files.
  • 1-bit dither: Playback performace of color movies has been significantly enhanced on black-and-white (1- bit) displays. This is particularly useful on PowerBook computers.
  • Sequence grabber dialogs: To provide for a more flexible and consistent user interface for configuring capture devices, the sequence grabber provides a set of standard configuration dialogs. Support for sound capture is also substantially improved.
  • Text media handler: In addition to sound and video, QuickTime 1.5 has built-in support for text. The text media handler is built using QuickTime's new Generic Media handler, which allows you to create your own QuickTime data types.
  • Standard compression: The Standard Image Compression dialog is now built into QuickTime. The user can pan and zoom the test image within Standard Compression.

GUILLERMO A. ORTIZWhen I met Guillermo I was really young. The first thing I said to him was, "Are you my dad?" Well, really I said something like "Waaaa!" As a matter of fact, I was a newborn. What I like about Guillermo is that we are almost the same. We like the same food and we watch the same TV shows, like Star Trek  and Nova . We like to play the same sports, such as tennis and basketball, and we both like to read a lot -- lately we even read the same books. But the one way we are most alike is that we love computers. Isn't that a weird coincidence? Another thing I like about Guillermo is that he is really smart. He used to be a teacher, and having a teacher around the house is always useful. He is always there to help me with stuff like math and science. He is also a great cook. The dinners he prepares for us on the weekends are fit for a king! He is like my family's own personal four-star chef. The music Guillermo likes to listen to is the Beatles, the Doors, Santana, and Cream. I like those groups too, but on our way to school we listen to rap. Guillermo is a great guy and I am really glad to have him for a dad. -- Guillermo A. Ortiz Jr., age 13 *

RECOMMENDED READINGThis article assumes a reasonable knowledge of QuickTime programming. For background information, see the QuickTime developer notes, available from APDA as part of the QuickTime Developer's Kit v. 1.0 (#R0147LL/A). For an introduction to QuickTime, see my article "QuickTime 1.0: 'You Oughta Be in Pictures'" in develop  Issue 7.*

There are no guidelines (as of this writing) regarding ways to allow users to set the rate of a movie; the solution implemented in TimeBaseSimple has not been approved by the User Interface gods. It's primitive, but it works.*

The TimeBaseSimple shuttle control is a cool CDEF created by C. K. Haun, member emeritus of Developer Technical Support. Its C source is included on the Developer CD Series  disc.*

THANKS TO OUR TECHNICAL REVIEWERS Bill Guschwan, Peter Hoddie, David Van Brink*


Community Search:
MacTech Search:

Software Updates via MacUpdate

VOX 2.8.30 - Music player that supports...
VOX just sounds better! The beauty is in its simplicity, yet behind the minimal exterior lies a powerful music player with a ton of features and support for all audio formats you should ever need.... Read more
Default Folder X 5.1.6b3 - Enhances Open...
Default Folder X attaches a toolbar to the right side of the Open and Save dialogs in any OS X-native application. The toolbar gives you fast access to various folders and commands. You just click on... Read more
CleanMyMac 3.8.6 - $39.95
CleanMyMac makes space for the things you love. Sporting a range of ingenious new features, CleanMyMac lets you safely and intelligently scan and clean your entire system, delete large, unused files... Read more
Postbox 5.0.17 - Powerful and flexible e...
Postbox is a new email application that helps you organize your work life and get stuff done. It has all the elegance and simplicity of Apple Mail, but with more power and flexibility to manage even... Read more
Amazon Chime 4.6.5852 - Amazon-based com...
Amazon Chime is a communications service that transforms online meetings with a secure, easy-to-use application that you can trust. Amazon Chime works seamlessly across your devices so that you can... Read more
coconutBattery 3.6.3 - Displays info abo...
With coconutBattery you're always aware of your current battery health. It shows you live information about your battery such as how often it was charged and how is the current maximum capacity in... Read more
VueScan 9.5.82 - Scanner software with a...
VueScan is a scanning program that works with most high-quality flatbed and film scanners to produce scans that have excellent color fidelity and color balance. VueScan is easy to use, and has... Read more
Thunderbird 52.3.0 - Email client from M...
As of July 2012, Thunderbird has transitioned to a new governance model, with new features being developed by the broader free software and open source community, and security fixes and improvements... Read more
Little Snitch 4.0.2 - Alerts you about o...
Little Snitch gives you control over your private outgoing data. Track background activity As soon as your computer connects to the Internet, applications often have permission to send any... Read more
Thunderbird 52.3.0 - Email client from M...
As of July 2012, Thunderbird has transitioned to a new governance model, with new features being developed by the broader free software and open source community, and security fixes and improvements... Read more

The best games we played this week - Aug...
Another busy week has come to a close. We played a lot of excellent games this week and now it's time to look back and reflect on some our favorites. Here are our picks for the week of August 18. [Read more] | Read more »
War Wings beginner's guide - how to...
War Wings is the newest project from well-established game maker Miniclip. It's a World War II aerial dogfighting game with loads of different airplane models to unlock and battle. The game offers plenty of single player and multiplayer action. We... | Read more »
How to win every 2v2 battle in Clash Roy...
2v2 is coming back to Clash Royale in a big way. Although it's only been available for temporary periods of time, 2v2 has seen a hugely positive fan response, with players clamoring for more team-based gameplay. Soon we'll get yet another taste of... | Read more »
Roll to Win with Game of Dice’s new upda...
Joycity’s hit Game of Dice gets a big new update this week, introducing new maps, mechanics, and even costumes. The update sets players loose on an exciting new map, The Cursed Tower, that allows folks to use special Runes mid-match. If you feel... | Read more »
Bottom of the 9th (Games)
Bottom of the 9th 1.0.1 Device: iOS iPhone Category: Games Price: $4.99, Version: 1.0.1 (iTunes) Description: Play the most exciting moment of baseball in this fast-paced dice and card game! | Read more »
The best apps for viewing the solar ecli...
If you somehow missed the news, many parts of the United States will be witness to a total solar eclipse on August 21 for the first time in over 90 years. It'll be possible to see the eclipse in at least some capacity throughout the continental U... | Read more »
The 5 best mobile survival games
Games like ARK: Survival Evolved and Conan Exiles have taken the world of gaming by storm. The market is now flooded with hardcore survival games that send players off into the game's world with nothing but maybe the clothes on their back. Never... | Read more »
Portal Walk (Games)
Portal Walk 1.0 Device: iOS Universal Category: Games Price: $1.99, Version: 1.0 (iTunes) Description: Portal Walk is adventure and relaxing platform game about Eugene. Eugene stuck between worlds and trying to find way back home.... | Read more »
Technobabylon (Games)
Technobabylon 1.0 Device: iOS Universal Category: Games Price: $4.99, Version: 1.0 (iTunes) Description: City of Newton, 2087. Genetic engineering is the norm, the addictive Trance has replaced almost any need for human interaction,... | Read more »
5 reasons why 2v2 is the best mode in Cl...
Supercell has been teasing fans with 2v2 windows that allow players to team up for limited periods of time. The Summer of 2v2 was just this past July, but players are already clamoring for more of that sweet, sweet team-based action. The fans have... | Read more »

Price Scanner via

Back To School With The Edge Desk All-in-one...
Back to school is just around the corner, and the ergonomically correct Edge Desk all-in-one portable kneeling desk is ideal for students living in dorms and small apartments, Edge Desk features:... Read more
Norton Core Secure Wi-Fi Router Now Available...
First introduced at the 2017 Consumer Electronics Show (CES), Norton Core, a secure, high-performance Wi-Fi router, fundamentally changed the concept of Wi-Fi routers by making security the primary... Read more
ViewSonic Adds New 27-inch 4K UHD Monitor to...
ViewSonic Corp. has introduced the VP2785-4K, a 27-inch 4K UHD (3840×2160) monitor that delivers precise and consistent color representation and performance to ensure incredible image quality. Built... Read more
Apple now offering Certified Refurbished 2017...
Apple is now offering Certified Refurbished 2017 27″ iMacs for up to $350 off original MSRP. Apple’s one-year warranty is standard, and shipping is free. The following models are available: – 27″ 3.... Read more
13-inch 2.3GHz MacBook Pros on sale for $100...
Amazon has the new 2017 13″ 2.3GHz MacBook Pros on sale today for $100 off MSRP, each including free shipping: – 13″ 2.3GHz/128GB Space Gray MacBook Pro (MPXQ2LL/A): $1199.99 $100 off MSRP – 13″ 2.... Read more
Clearance 2016 13-inch MacBook Airs available...
B&H Photo has clearance 2016 13″ MacBook Airs available for up to $200 off original MSRP. Shipping is free, and B&H charges NY & NJ sales tax only: – 13″ 1.6GHz/128GB MacBook Air (MMGF2LL... Read more
Clearance 21-inch and 27-inch iMacs available...
B&H Photo has clearance 21″ and 27″ Apple iMacs available for up to $500 off original MSRP, each including free shipping plus NY & NJ sales tax only: – 27″ 3.3GHz iMac 5K: $1799 $500 off... Read more
New iOS 11 Productivity Features Welcome But...
The iOS community is in late summer holding mode awaiting the September arrival of the iPhone 8 and iOS 11. iOS 11 public betas have been available for months — number six was released this week —... Read more
Samsung Electronics Launches New Portable SSD...
Samsung Electronics America, Inc. has announced the launch of Samsung Portable SSD T5 – its newest portable solid state drive (PSSD) that raises the bar for the performance of external memory... Read more
TrendForce Reports YoY Gain of 3.6% for 2Q17...
Market research firm TrendForce reports that the global notebook shipments for this second quarter registered a sequential quarterly increase of 5.7% and a year-on-year increase of 3.6%, totaling 39.... Read more

Jobs Board

Development Operations and Site Reliability E...
Development Operations and Site Reliability Engineer, Apple Payment Gateway Job Number: 57572631 Santa Clara Valley, California, United States Posted: Jul. 27, 2017 Read more
Frameworks Engineering Manager, *Apple* Wat...
Frameworks Engineering Manager, Apple Watch Job Number: 41632321 Santa Clara Valley, California, United States Posted: Jun. 15, 2017 Weekly Hours: 40.00 Job Summary Read more
Business Development Manager - *Apple* Medi...
Job Summary Apple Music is a single, intuitive app that...- all in one place. You can stream any Apple Music song, playlist or album, and download it Read more
Development Operations and Site Reliability E...
Development Operations and Site Reliability Engineer, Apple Payment Gateway Job Number: 57572631 Santa Clara Valley, California, United States Posted: Jul. 27, 2017 Read more
Frameworks Engineering Manager, *Apple* Wat...
Frameworks Engineering Manager, Apple Watch Job Number: 41632321 Santa Clara Valley, California, United States Posted: Jun. 15, 2017 Weekly Hours: 40.00 Job Summary Read more
All contents are Copyright 1984-2011 by Xplain Corporation. All rights reserved. Theme designed by Icreon.