[ Be Logo ] [ Home ][ Site Map ][ Search ][ Contact ][ Be Europe ][ Developers Banner ]
About Be, Inc.Be ProductsThe World of BeDeveloper ServicesJobs @ Be[Bottom]

Be Developer Services

Free Resources

BeIA FAQ

BeIA Evaluation

Partner Program

Join

Partner Area

|

  The BMessage
Issue 4    June 21, 2000

News

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

Marketplace

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.

click for larger image

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

JLG

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

The Be Line

Look for a new article from someone inside Be in the next issue.

return to top

Engineering Insights

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.



.
About Be, Inc. | Be Products | World of Be | BeOS Support | Jobs | Developers | Press | Partners | Investors
.
Copyright © 2001 by Be, Inc. All rights reserved. (Legal Info)
Comments, questions, or confessions about our site? Please write the Webmaster!