Issue 4 June 21, 2000
Be Press Releases
June 20, 2000
Be Incorporated
Appoints John Moon as Vice President of Business Development
June 14, 2000
Be Incorporated First
to Offer mp3 Encoding and Decoding for Fully Featured Internet
Appliances
return to top
The Market for Digital Media Playback Devices
Part I, Audio
by Brennan Spies, Sr. Market Analyst
The term "convergence" has been bandied around for many years, but up
until recently seemed to have very little relevance to the average
consumer. The advent of a number of technologies, including DVD, MP3,
and Personal Video Recording (PVR) is changing all this as
traditionally PC-only technology begins to cross the divide to the
world of consumer electronics. This week I will focus on digital
audio, which has quickly become one of the hottest areas of the
Internet, consumer electronics, and the law offices of major music
labels.
Digital Audio
At first blush, the advantages of digitally compressed audio ripped
from CDs or downloaded from the Internet would seem to be the ability
to play music on your PC/digital playback device and to create your
own custom music compilations. Indeed this is what the burgeoning
market for portable MP3 players has focused on initially, offering a
"cassette tape"-like functionality to allow the consumer to take some
of their favorite music with them wherever they go. But the advantages
of high-quality digital audio that is "unchained" from a physical
format such as compact disc opens up a wider range of possibilities,
including:
- Streaming audio. Currently with services such as My.MP3.com you can
store songs from your CD collection in an online "locker" which you
can then stream to any location you like (in the future you may even
do this directly from your home network). You can also listen to
online radio stations like Spinner.com or ImagineRadio.com, or even
become your own DJ at Shoutcast.com.
- Organizing your music collection. Tired of digging around for that
CD to listen to the one good song you want to hear? With digitally
stored music all of your favorites are at your fingertips. You can
create your own customized playlists to suit the occasion or your
particular mood. You can even use it to separate the collections of
individual family members.
- Searching for music. Not only can you organize your music by
genre/artist, you can also use the same criterion to search for new
music on the Internet to purchase a CD or download the album/single
directly.
- Burn a CD with your own custom music for playback in other CD
players.
- Broadcast music wirelessly to other devices in the house.
- Easily add or subtract digital effects such as reverberation, 3D
audio field enhancement, or vocal extraction (karaoke, anyone?).
Add in home networks and broadband wireless Internet access, and the
possibilities are truly expansive.
Digital Audio Playback Devices
As you might guess, we at Be believe that with the evolution of
convergent appliances, you will not need and probably would not want
your PC to be the primary device for creating or accessing your
digital audio collection. Although portable MP3 players are currently
the best-known forms of consumer electronics devices for digital music
playback, a new wave of devices based upon boombox and stereo
component form factors has just begun to hit the market that will open
up much of the functionality that I've just discussed above. These
devices will generally be built around large capacity hard drives, a
CD /CD-RW/ or DVD, and will offer interoperability with your stereo
system, PC, and even television. As Be has previously annou
nced, we are building a software platform to enable these devices.
BeIA offers significant advantages over other choices with its
advanced media handling and native TCP/IP implementation.
Awareness and Interest in MP3 and Playback Devices
So what is the level of interest out there for these devices? eBrain,
a service of the Consumer Electronics Association, recently surveyed
the U.S. online population with these types of questions. They found
that:
- Awareness of the MP3 format is high among males and young adults
- 51% of those surveyed between the ages of 18-34 had music files from
the Internet saved to their computer's hard drive (31% had copied
music from a CD onto their computer)
- MP3 files are popular due to free availability and the convenience
of downloading
- 75% of Gen-Yer's (ages 15-21) rate the sound quality of MP3 as being
as good or better than a typical stereo
- 63% of those surveyed listen to Net radio broadcasts and 73% sampled
a song from an album via the Web
- At a price of $5 less than a retail CD, 40% of those surveyed
between the ages of 18-34 were interested in purchasing albums for
direct download over the Net. 51% of this same group expressed
interest in downloading an album in order to copy it onto a blank CD.
- Gen-Yer's (ages 15-21) own an average of 52 CDs versus the national
average of 32.
- Gen-Y expects to buy an average of $400 in consumer electronics in
the next 2 years, for a total of over $10 billion.
These findings suggest that, despite the relative newness of digital
audio files in the eyes of the general public, the younger generation
is rapidly embracing the change. Combined with Internet distribution
and interactivity, digital audio files will eventually lead to a shift
in paradigm more profound than the switch to compact discs in the
early 1980's.
Market Projections for Digital Media Playback Devices
Current market projections by Jupiter Communications estimate total
owners of dedicated digital media playback devices to reach 18.6
million in the U.S. by 2005 or about 18% of the online population. It's too early to tell whether or not this is a conservative estimate,
but if major players such as Philips or Sony jump into this market the
volume will change dramatically.
Next Time
In Part II of this installment, I will talk about Video playback on
convergent devices, specifically technologies such as PVR and home
video recording/editing.
return to top
Jean-Louis Gassée Column
by Jean-Louis Gassée
Look for a new article from JLG in the next issue.
return to top
The Be Line
Look for a new article from someone inside Be in the next issue.
return to top
Introducing QuickRes
by Dianne Hackborn, Software Engineer / Framework
Some of you may have noticed a new experimental developer
tool called QuickRes that was included with BeOS 5 Professional Edition.
This is (at long last) an official graphical application for
viewing and editing a program's resource data. You can find
the current version of QuickRes on our FTP site at:
x86: ftp://ftp2.be.com/outgoing/quickres/QuickRes-x86.zip
ppc: ftp://ftp2.be.com/outgoing/quickres/QuickRes-ppc.zip
This includes a number of bug fixes and improvements to
the version that was supplied with Release 5, so be sure to
download it and unzip over the old version.
The QuickRes distribution includes a basic manual that
describes how to use it, so that will not be covered in
this article. Instead, I'm going to discuss the rest of
QuickRes -- a general add-on based architecture for viewing
and editing standard BeOS data types -- and particularly
how to write your own editor add-ons.
The core QuickRes architecture is implemented in
libreseditor.so, which defines what a piece of "resource
data" is (BResourceItem), how you hold on to that data
(BResourceHandle), and how a related group of resource
items is organized (BResourceCollection). The included
header files are fairly well commented, so you should be
able to get a pretty good idea of how each of these
objects works by looking there.
The library also includes some utility classes, such as
BMiniList and BUndoContext, which should at some point
migrate into a more appropriate kit.
Writing an Editor Add-On
A resource editor add-on has two basic pieces: the top-level
add-on interface (associated with an entire
BResourceCollection), and the interfaces for viewing and
editing the resource data (associated with a particular
BResourceItem in a BResourceCollection). This article will
give you an overview of how editor add-ons work; there are
a number of example add-ons included with QuickRes that you
can refer to for actual implementation. The best example to
start with is the "basicvalue" editor, which hides all the data
editing details in its BasicValue class.
At its highest level, your editor add-on must export one
function:
extern "C" _EXPORT BResourceAddon*
make_nth_resourcer(int32 n, image_id you,
const BResourceAddonArgs& args,
uint32 flags, ...);
When called, 'n' is the index of the editor to create
(starting at zero), 'you' is the image of your add-on, 'args'
is an opaque type containing state information used by the
resource editor library, and 'flags' is currently always set
to zero. You return a new instance of a BResourceAddon
subclass that corresponds to editor #n. Currently, you'll
only be called with n == 0, but a future version of the
library will support multiple BResourceAddon classes in a
single executable. To deal with that, you should return your
BResourceAddon instance when n is 0 and NULL for all other
values of n.
The BResourceAddon object that you return represents your
high-level interface with the rest of the editor architecture.
This is where you tell everyone about what kinds of data you
can edit, handle global editing operations, and provide
access to your other classes that actually show and edit
data.
Creating New Resources
The GetNthGenerateInfo() function is how you tell others
about the kinds of resources you can create. When called,
it fills in the given BMessage object with at least two
fields:
S_GENERATE_TYPE: An int32 containing the type codes that you
can create.
S_GENERATE_NAME: Corresponding descriptive names (displayed to
the user) for these types.
If you can generate more than one type of resource, fill
in each type for successive values of 'n' and return an
error code when n goes past the last index.
The GenerateResource() function is then called to actually
create a new resource. When it's called, you are given a
BMessage that contains the same data you returned from
GetNthGenerateInfo(). If your add-on can create more than
one type of resource, you use this message to determine
which type to create.
Identifying Resources
Resource editors report their ability to handle a particular
piece of data as a measure of "quality." This is a value
from 0.0 to 1.0 that quantifies how good your editor would
be at viewing or editing something. Higher-quality values
are better -- the add-on with the highest quality for a
particular resource is the default editor the user sees.
(And currently in QuickRes, this is the only editor that
can be used.)
There are two functions that you must implement to report
your quality.
float QuickQuality(const BResourceItem* item) const;
Return a quality measure without performing much
computation. E.g., by only looking at the resource
type, its size, and maybe the first few bytes of data.
float PreciseQuality(const BResourceItem* item) const;
Return a quality measure that is as accurate as
possible. E.g., a bitmap editor may try to open the
resource with the Translation Kit to see if it can be
turned into a bitmap.
Pastes and Drops
For a consistent user experience, your add-on should also
handle any relevant data paste or drops. You do this by
implementing two functions for each: the first returns a
quality expressing how good it is at handling a piece of
data, and the second performs the operation. Thus:
float PasteQuality(const BMessage* clip) const;
status_t HandlePaste(const BMessage* clip);
Report quality and perform paste of data in clipboard
message 'clip'.
float DropQuality(const BMessage* drop) const;
status_t HandleDrop(const BMessage* drop);
Report quality and perform drop of data received in
the message 'drop'.
In addition, your editor add-on will normally ignore drop
messages that contain files. You can then actually read the
file with these functions:
float BufferQuality(BPositionIO& buf, const char* mime_type = 0,
entry_ref* ref = 0) const;
status_t HandleBuffer(BPositionIO& buf, const char* mime_type = 0,
entry_ref* ref = 0);
The file is contained in the stream 'buf'. Optional data
may also be supplied -- the file's MIME type in 'mime_type',
and the actual file reference in 'ref'.
Editing
There are two types of editors you can implement. A "Full
Editor" is one that has a full BView-based interface for
the user to manipulate the resource data and view its
values. A "Mini Editor" is one that provides a small preview
to the user of the resource data, and possibly some limited
editing ability. In QuickRes, the Full Editor is what you
see at the bottom of the main window or in secondary windows;
the Mini Editor is what you see in the Data column of the
resource list.
Each type of editor has a single function in BResourceAddon.
MakeMiniEditor() is called to create a mini editor, which
is returned as a BMiniItemEditor object. MakeFullEditor()
is called to create a full editor, which is returned as a
BFullItemEditor object. The mini editor is optional (you
can return NULL), but you must always return a valid
object when MakeFullEditor() is called.
Both types of editors follow the same basic pattern: an
instance is instantiated on a particular resource item, which
is the data that it displays and edits. This is known as the
"primary item." The classes derive from BResourceAddonBase,
which is the base class for editing and watching resource
data.
Your editor can operate on additional resource data by
using the Subscribe() function in BResourceCollection. For
every resource item that you're watching, your DataChanged()
method is called when changes happen to it. The primary item
is automatically subscribed, so normally you don't need to
do anything extra.
One thing you must be careful about when writing an editor
is locking. The resource collection (all resource items and
the state information about them) is protected by a
read/write lock. To look at or modify any data, you must
retrieve the BResourceCollection object by calling
ReadLock() or WriteLock(), which in turn acquire the lock.
Normally you'll acquire read or write access to the
collection while processing window events in your editing
view. In this case, your editor's window will be locked,
followed by the resource collection. Because of this order,
you must never try to acquire your window lock while holding
the resource collection lock or you can have a deadlock.
Another complication appears in locking between windows.
An editor's DataChanged() method is usually not called by
its window thread, so you can't access any data associated
with that window. Furthermore, trying to lock your window
thread inside DataChanged() can lead to a deadlock between
your window thread and the thread of your caller. The
solution to this is to have DataChanged() send a message
to your window, which can then take whatever action is
needed. BResourceAddonBase helps with this by allowing you
to specify a BHandler "owner" of the object, either in its
constructor or by calling SetChangeTarget(). Once set, the
BHandler will receive a B_RESOURCE_DATA_CHANGED message
when a change occurs, and can get the details of the change
with BResourceCollection::GetNextChange().
The Full Editor
BFullItemEditor is the basis for a full graphical editor.
You typically use it as a mix-in with a BView -- your
subclass is the interface to both watching and editing data,
and the top-level graphical component of the editor. The
BFullItemEditor method View() returns a pointer to this
top-level BView.
The rest of the full editor interface is optional. There
are functions for supplying custom menus, managing persistent
configuration information, synchronizing uncommitted data
changes, and changing the current item being edited. See the
ResourceEditor.h header file and the example add-ons for
more information.
The Mini Editor
BMiniItemEditor is the basis for a data viewer (and possible
editor). It's designed to be relatively lightweight, as many
mini editors can exist at the same time. The class does not
have its own implicit view -- instead it uses its owner's
view for most of its display.
The DrawData() function is called when the mini editor
needs to be drawn, telling it the view to draw and where.
You can do all the drawing here yourself, or use the helper
function DrawText() to draw a line of text.
Currently BMiniItemEditor only supports editing of string
data. This is done by implementing the function ReadData()
to return a string for the user to edit, and WriteData() to
copy the edited string back into the resource data. If
ReadData() is not implemented, the mini editor can only
be viewed.
Summary
I hope that this article gives you a good place to start
when writing your own resource add-ons. Be sure to look at
the included example add-ons, which should also serve as a
good basis for your own.
Remember that QuickRes and its libraries are still experimental
-- this means that future versions WILL break existing add-ons,
so you shouldn't use these APIs in your own applications
(though of course you can use any resources you make with it).
It also means that this is the best time to provide feedback
on the library, while it's still possible to make significant
architectural changes. If there are any new features or
improvements you'd like to see in the API, please let me know!
return to top
Statements contained in this Newsletter that are not historical facts are
"forward-looking statements" including without limitation statements
regarding the demand for, future market penetration and market acceptance of
BeIA and BeOS, the shipment dates of Be's products, and the future operating
results of Be Incorporated. Actual events or results may differ materially
as a result of risks facing Be Incorporated or actual results differing from
the assumptions underlying such statements. Such risks and assumptions
include, but are not limited to, risks related to competition, market
acceptance and market penetration of Be's products, ability to establish and
maintain strategic relationships, the benefit of Be's products to OEM and
Internet appliance manufacturers. the continued availability of third party
BeOS applications and drivers, and the ability to establish and maintain
strategic publishing relationships. All forward-looking statements are
expressly qualified in their entirety by the "Risk Factors" and other
cautionary statements included in Be Incorporated's Annual Report on Form
10-K for the year ended December 31, 1999, and other public filings with the
Securities and Exchange Commission.
The BMessage
Copyright (c) 2001 by Be, Inc.
All rights reserved.
Be, Inc.
800 El Camino Real, Suite 400
Menlo Park, CA 94025
Tel: (650) 462-4100
Fax: (650) 462-4129
Web: http://www.be.com/
Be, BeOS and BeIA are trademarks or registered trademarks of Be Incorporated
in the United States and other countries. Other brand product names are
registered trademarks or trademarks of their respective holders. All rights
reserved.
The BMessage is sent to subscribers of one or more of the Be mailing lists.
For more information about subscribing/unsubscribing, see the Be web site:
http://www.be.com/world/mailinglists.html. The Be web site also offers a complete set of current and back issues of Be Newsletters:
If you have any comments about The BMessage, please e-mail them
to:newsletter@be.com.