Table of Contents
New Resource "abuzz" with BeOS Audio Product Info
A comprehensive new resource will make it easier for buyers and sellers of BeOS audio products to come together. "Product Buzz!," (http://www.lebuzz.com/productbuzz.html) hosted by the "le BUZZ" web site (http://www.lebuzz.com/), is an all-in-one listing of commercial hardware and software vendors and their products, including links to the companies, descriptions of the products, and anticipated release dates for those items not yet ready to purchase. le BUZZ "Buzzmaster" Dane Udenberg says the new resource is primarily targeted toward audio professionals, musicians, MIDI studios, and other high-end audio users. A link from the page points seekers of shareware and freeware to Be.com's BeWare site. In addition to the obvious benefit companies and end-users will get from the new resource, an added side benefit is its usefulness to value-added resellers. "We've already gotten several inquiries from several resellers who are interested in working with the companies on the list to create all-in-one PC audio workstation solutions, complete with audio hardware, and software components including editing, composition, and multi-tracking," Udenberg said. Visitors to the new site page are encouraged to alert Dane to any additional products not already listed, or updated information on the products already on the list.
BE ENGINEERING INSIGHTS: By Arve Hjønnevàg
BeOS drivers are allowed to open files, but there are a few reasons why you don't want to do this to read settings. For one thing, if your driver is loaded before the file system, you can't open your settings file. If the boot volume's disk driver needs information from the settings file before it can access the disk, just opening a file won't work. Also, parsing settings files can be complicated by corrupt files, and a crash in driver code is fatal. The next BeOS release will have an API for drivers and kernel modules to get settings. The API includes easy access to Boolean and string settings, and is available for all drivers and modules. For complex settings, a call is provided that returns the settings as a tree of parameters and values. The boot loader reads the settings files from the selected boot volume and passes them to the kernel for use by drivers. The boot loader also lets the user append settings at boot time. A line of the form "filename:parameters" in the advanced savemode menu will add "parameters" to the end of the specified settings file. This can be used to change debugging information, and to test different options on hardware where the driver doesn't work. For beta testers, all this should already work in 4.1b3. The functions are defined as follows: void *load driver settings(const char *drivername); status t unload driver settings(void *handle); const char *get driver parameter(void *handle, const char *keyname, const char *unknownvalue, const char *noargvalue); bool get driver boolean parameter(void *handle, const char *keyname, bool unknownvalue, bool noargvalue); const driver settings *get driver settings(void *handle);
A driver calls load driver settings with the name of the settings file as the argument (settingshandle = load driver settings(drivername);). This returns a handle that is passed to the other driver settings functions. The driver can look for specific parameters by calling get driver parameter and get driver boolean parameter, or it can get a pointer to the parsed settings from get driver settings. When the settings have been processed, unload driver settings will free the resources. Let's look a simple example first. A driver "sample1" has one setting, "foo", that can be true or false. To specify the value of "foo", a line of form "foo value" is placed in the settings file. If there is no entry for "foo" in the file, the default is false; if there is an entry "foo" but no value is specified, we assume the value is true. The code for our example looks like this: void *settingshandle; bool foo; settingshandle = load driver settings("sample1"); foo = get driver boolean parameter(settingshandle, "foo", false, true); unload driver settings(settingshandle); Now let's look at how this works. If there is no settings file named "sample1" in ~/config/settings/kernel/drivers/, load driver settings will return NULL. Since we pass NULL to get driver boolean parameter it will return the value we specified for no entry: false. "foo" will therefore be false. If the file exists, but doesn't contain an entry "foo", the result is the same. In this case, we get a valid handle and get driver boolean parameter will look for a "foo" parameter in the file. Since the file doesn't contain "foo", it returns false as requested. If the file contains one line starting with "foo", the second word in this line is used as the value. If no value is specified, get driver boolean parameter will return the last argument passed. If a value is specified and is one of the strings "1", "true", "yes", "on", "enable", or "enabled", true will be returned. If the value is "0", "false", "no", "off", "disable", or "disabled", false is returned. If the value doesn't match any of these strings it is treated the same as if no entry was found; in this case, false. If more than one line in the file starts with "foo", the last one is used. This allows the user to override settings from the boot loader. Another simple case is when a driver has a string setting. void *settingshandle; const char *string; settingshandle = load driver settings("sample1"); string = get driver parameter(settingshandle, "string", NULL, "default"); unload driver settings(settingshandle); This works the same way as get driver boolean parameter, except that the string value of string is returned instead of the logical value. If the file doesn't exist, or exists but has no line starting with "string", string will be NULL. If the last line starting with "string" has no values, string will be "default". If string has a value, it is returned as a string. Note that only one value is returned. If more than one value is needed for a key, use get driver settings and search for your key. For drivers that need complex settings, the get driver settings will return the settings file as a tree. This tree allows a parameter to have multiple values and subparameters. The following structure holds the root of the tree. typedef struct driver settings { int parameter count; struct driver parameter *parameters; } driver settings; Each parameter is of the form: typedef struct driver parameter { char *name; int value count; char **values; int parameter count; struct driver parameter *parameters; } driver parameter; The settings file follows these rules:
Here's an example that clarifies these points. For the file: device 0 { attribute1 value attribute2 value } device 1 { attribute1 value } get driver settings will return a pointer to the following tree: driver settings = { parameter count = 2 parameters = { { name = "device" value count = 1 values = { "0" } parameter count = 2 parameters = { { name = "attribute1" value count = 1 values = "value" parameter count = 0 parameters = NULL }, { name = "attribute2" value count = 1 values = "value" parameter count = 0 parameters = NULL } } }, { name = "device" value count = 1 values = { "1" } parameter count = 1 parameters = { { name = "attribute1" value count = 1 values = "value" parameter count = 0 parameters = NULL } } } } } DEVELOPERS' WORKSHOP: All Hail the Mother Node! By Stephen Beaulieu "Developers' Workshop" is a weekly feature that provides
answers to our developers' questions, or topic requests.
To submit a question, visit
http://www.be.com/developers/suggestion_box.html.
Our thanks to the developers who attended last weekend's
BeDC. It was great to meet you and to pass on our Media Kit
knowledge to you. We promised you some sample code
RealSoonNow(tm) at the conference, so here's the first
delivery.
In the Node Track session, we presented a new class -- the
MotherNode -- as a work in progress for the next release.
This class helps manage the events your node needs to
handle. It's another virtual BMediaNode subclass, so you can
mix it with all the other classes: BBufferConsumer,
BBufferProducer, BControllable, BFileInterface, and
BTimeSource. Unlike these other classes, however, the
MotherNode doesn't define any new services that your node
must provide. Instead, it implements some basic node
necessities for you.
In a nutshell, the MotherNode services the node's control
port with its own thread. When Subclasses of the MotherNode will implement MessageReceived
and other time-related You'll find the MotherNode class at
<ftp://ftp.be.com/pub/samples/media_kit/MotherNode.zip>
This code is only of use to people with access to the
current beta CD.
Finally, it is certain that the MotherNode's functionality
will find its way into the final release under another name.
However, the API should stay pretty similar, so only minor
code changes will be needed.
"I can't print."
These are words that strike fear in the hearts of many
good men and women in call centers all over the world,
including some who are reading this article right now.
We are the knowledgeable and somewhat strained voices on
the far end of "the help line." We need a vacation and a
fresh look at humanity. We are tech support. Let's look
at how the user got to us.
Some time in the past, your company -- which consists of
three developers respectively titled VP of Development 1,
VP of Development 2, and King -- encountered a situation
they were not entirely prepared for. The company just
released Product, the coolest thing on the block, and
made its first sales. Finally! There is great rejoicing.
Then, John Q. Pedestrian, famous for not knowing the
difference between WALK and DON'T WALK, decides to buy
your product. He pays his money, takes home your software,
and installs it. OK, so far. But then something fails to
happen exactly how, when, where, or why John expected. He
sends e-mail to your company:
The person who read the mail thinks, "What do you MEAN you
can't print? I spent weeks, months on this! It works fine
here! We proved it! All our testing works fine! What could
possibly be wrong?"
Let me stop here and say that it's easy to blame the user.
But remember, John is a real person with family, friends,
loved ones, a mortgage, a driver's license *shudder*, and a
job. John can balance a checkbook. Sometimes he does his own
taxes. He's had some college education. He's not stupid. He
may or may not know the available resources. He may not
speak your language. He may or may not have good
communication skills. He's stuck.
Your development team has suddenly become its own tech
support. This is a problem. It has to figure out what the
company's users need, as well as what they expect -- and
what the company expects of them. It must determine what
resources are available to meet users' needs and how to
deploy those resources.
As Be's Customer Technical Support (CTS) manager, figuring
these things out is my job. I make sure you can find the
answers you need, and that someone is there to supply the
answers you can't find. And if other support people can't
help you, I'm the answer guy of last resort. My experience
for that role comes from having worked for the world's
largest supplier of outsourced technical support, on a
variety of subcontracts ranging from hardware and software
to operating systems and appliances. I know my share and
have all the funny stories to prove it.
If you're interested in some background on technical
support, one of the best articles I've read was written for
"MacWorld" magazine, by David Pogue. He spent a day with
Apple's support group just after it had changed from free to
fee-based support. Based on the kind of service people were
getting for the fee charged, he concluded that "... [Apple]
should charge twice that [amount]." (See
<http://macworld.zdnet.com/pages/october.98/Column.4493.html>.
So, why is support a problem?
Needs, Wants and, Expectations
What the user wants from a product is often unrealistic. For
example, that the product should work immediately and
unconditionally, right out of the box, without having to
*gasp* read the manuals and instructions. And should
something fail, the guy on the other end of the phone should
be the one who wrote it, and can wave his magic wand and
make it work while releasing daily free updates. He wants
unlimited free support on a toll-free call. The developer
wants people to buy the product and register it, so they can
be solicited to buy Product updates, and leave the developer
alone so he can write Product 2.0.
User expectations are a more realistic versions of wants:
competent, bug-free software; a warm, skilled body at the
other end of the support line; bug fixes as necessary; a
route to request new features; and so on. These can be tuned
up or down depending on the cost of the product and the size
of the company.
Needs are an acceptable compromise between user wants and
expectations, and developer resources.
Determining the Needs of Your Users
The easiest way to measure a company's support staffing
needs is to see how long it takes to respond to each
contact. If a company is a week behind on the support
e-mail, or if it knows that users are getting busy signals
or 20-minute hold times, it's time to get some help. To
decide how to handles users' needs, let's look at common
BeOS developer-sized situations.
Joe Developer runs the Small Shareware Group Co. Your
company is you, or maybe you and a couple of friends. People
want support for freeware; they don't generally expect it,
and they're happy to get it. If you have a shareware or
commercial product, you need at least one person
responsible for responding to users. Here are some tips:
Customers expect little when no money is involved, and are
generally forgiving. Once you charge however, expectations
shift. Customers expect support, updates, and other
commercial software services, including daytime phone
support, e-mail support, and FAQs on a web site. People want
the ability to document requested features and report bugs.
They want updates to cure bugs and possibly add features,
but they don't usually expect them to come instantly.
Mid-sized CommercialSoft
This situation postulates a loosely defined group of
developers, support, and operations people. Support
technicians generally aren't the best paid group; they'll
often take the next best thing on short notice, and burn out
regularly, costing you time to find and train a new
technician, time away from other work, etc. You should
consider getting quotes from outsource support companies to
see if it will better accommodate growth, both in your
support team and in your development team. If Product 3.0
takes off as you think it will, having a flexible support
team in place can make all the difference. Ask for some
estimates on outsourced support, so you can look at your
current costs and make an informed choice.
Supplying Users' Needs
Once you've looked at where your needs and your customers'
needs meet, you have the options of indirect and direct
support to supply them.
Indirect support includes FAQs, tips, manuals, faxback
lines, etc. These are directly available to the user, with
no human contact required. This is cheap, takes little time
to put together, and any number of people can use it at no
additional cost to you. The more you spend here, the less
your other costs will be. Some general tips:
Direct support can be by e-mail or phone. Consider that an
average 20 minute phone call can cost about US $10-30;
e-mail costs between 25% and 50% of that amount. On
average, a technician can respond to three times as much
e-mail as phone calls. However, some people insist on using
phones, or are too impatient for e-mail. Depending on your
needs, you can decide what combination is best for your
company. Miscommunications and slow interaction times in
e-mail can be a problem, but questions that call for the
same reply are much easier and cheaper for both the
developer and the user via e-mail than on the phone.
Who does the support also affects costs. There are generally
three possibilities here:
The most common is a dedicated group on a pay-per-contact
price. In this situation, if there are a lot of questions in
one month, the outsourcer moves more people in (and trains
them) as needed. If the calls drop by 50% the next month,
the outsourcer moves people to other responsibilities, until
they're needed again. This cuts costs considerably, though
quality control and employee retention can still be problem
areas.
Making a Choice
The best way to decide what you should do is by assessing
your needs and their potential costs. Tech support providers
will be glad to write a quote for you. If you're looking at
in-house support, remember to include computers, benefits,
training time, phone lines and charges, office space, etc.
in the costs. If you have other questions, contact me and
I'll try to answer them.
But to get back to John Q. Pedestrian, his printing problem
was a proprietary software driven printer switchbox without
BeOS equivalent software, and he can now print. He got his
answer within two days, and he's happy as a clam. He
disconnects the old 386 he stopped using and buys future
updates of your product and mentions how cool your company
is to his friends. Meanwhile, the technician sighs wearily
and opens the next e-mail...
I always feel nervous going to a developer conference,
because we're going to meet the people who literally
make us. It may be obvious but nonetheless bears
repeating that an operating system has little or no
value by itself. Applications determine its value --
hence the vital role of software developers -- and of
events such as the BeDC. A developer conference is an
opportunity to give a progress report on our work. We
get vigorous feedback from people who are committed to
the platform and, in return, we offer them information
and suggestions on how they can make the best use of
the APIs and development tools. And, of course, there
are the T-shirts.
That's more or less the script we followed at last
weekend's event. By all accounts, our opening act was
a little flat -- I know, I was part of it -- but the
main part, the Media Kit sessions, got the good reviews,
much to our grateful delight. For this conference, we
did some things differently: we charged admission; and
we focused on the Media Kit, instead of addressing all
aspects of the BeOS. We highlighted the Media Kit
because it is the key to the most important application
space -- digital media -- and it provides the tools to
produce "tangible" (I should probably say visible and
audible) proofs of BeOS advantages.
The result was a happy, productive conference. Several
attendees made unsolicited comments about the usefulness
of the session and the productive use of their time.
I even got the same feedback from a Be engineer who's
been immersed in other parts of our work. This is not to
say that we won't have general purpose conferences in
the future, but for the introduction of the Media
Kit -- the keystone of the BeOS edifice -- we wanted to
ensure that its concepts and facilities were treated
with the attention its role in the BeOS architecture
warrants.
At the beginning, I stated I was always nervous going
to a developer's conference, but I should have added I
always enjoy these events and come away more motivated
than ever after meeting people who take our future in
their own hands. My thanks to them and to the Be team
for making this conference a success -- and a great
time for yours truly.
1997 Be Newsletters | 1995 & 1996 Be Newsletters Copyright ©1999 Be, Inc. Be is a registered trademark, and BeOS, BeBox, BeWare, GeekPort, the Be logo and the BeOS logo are trademarks of Be, Inc. All other trademarks mentioned are the property of their respective owners. Comments about this site? Please write us at webmaster@be.com. |