Add my ESound Daemon Sink media node source code.
I need it on an other box anyway... Currently uses hardcoded server IP. Jamfile likely doesn't work (needs net libs); and requires ZETA due to TextParameter (for server IP but unused yet; I think Haiku should have it too) will need some ifdefs Use the provided makefile for now. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@17886 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
@@ -0,0 +1,316 @@
|
||||
/*
|
||||
* ESounD media addon for BeOS
|
||||
*
|
||||
* Copyright (c) 2006 François Revol ([email protected])
|
||||
*
|
||||
* Based on Multi Audio addon for Haiku,
|
||||
* Copyright (c) 2002, 2003 Jerome Duval ([email protected])
|
||||
*
|
||||
* All rights reserved.
|
||||
* Redistribution and use in source and binary forms, with or without modification,
|
||||
* are permitted provided that the following conditions are met:
|
||||
*
|
||||
* - Redistributions of source code must retain the above copyright notice,
|
||||
* this list of conditions and the following disclaimer.
|
||||
* - Redistributions in binary form must reproduce the above copyright notice,
|
||||
* this list of conditions and the following disclaimer in the documentation
|
||||
* and/or other materials provided with the distribution.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
|
||||
* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
|
||||
* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
|
||||
* EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
*/
|
||||
#define _ZETA_TS_FIND_DIR_ 1
|
||||
#include <FindDirectory.h>
|
||||
#include <File.h>
|
||||
#include <Path.h>
|
||||
#include <sys/socket.h>
|
||||
#include <arpa/inet.h>
|
||||
#include <netdb.h>
|
||||
#include <netinet/in.h>
|
||||
#include <netinet/tcp.h>
|
||||
#include <errno.h>
|
||||
#include <stdlib.h>
|
||||
#include "compat.h"
|
||||
//#undef DEBUG
|
||||
//#define DEBUG 4
|
||||
#include "debug.h"
|
||||
#include <Debug.h>
|
||||
#include "ESDEndpoint.h"
|
||||
|
||||
ESDEndpoint::ESDEndpoint()
|
||||
: BDataIO()
|
||||
, fHost(NULL)
|
||||
, fPort(ESD_PORT)
|
||||
, fSocket(-1)
|
||||
, fDefaultCommand(ESD_CMD_STREAM_PLAY)
|
||||
, fDefaultCommandSent(false)
|
||||
, fDefaultFormat(ESD_BITS8 | ESD_MONO)
|
||||
, fDefaultRate(ESD_DEFAULT_RATE)
|
||||
, fLatency(0LL)
|
||||
{
|
||||
CALLED();
|
||||
}
|
||||
|
||||
ESDEndpoint::~ESDEndpoint()
|
||||
{
|
||||
CALLED();
|
||||
if (fSocket > -1)
|
||||
closesocket(fSocket);
|
||||
fSocket = -1;
|
||||
}
|
||||
|
||||
status_t ESDEndpoint::SendAuthKey()
|
||||
{
|
||||
CALLED();
|
||||
BPath kfPath;
|
||||
status_t err;
|
||||
off_t size;
|
||||
char key[ESD_MAX_KEY];
|
||||
err = find_directory(B_USER_SETTINGS_DIRECTORY, &kfPath);
|
||||
kfPath.Append("esd_auth");
|
||||
BFile keyFile(kfPath.Path(), B_READ_WRITE|B_CREATE_FILE);
|
||||
err = keyFile.GetSize(&size);
|
||||
if (err < 0)
|
||||
return err;
|
||||
if (size < ESD_MAX_KEY) {
|
||||
keyFile.Seek(0LL, SEEK_SET);
|
||||
srand(time(NULL));
|
||||
for (int i = 0; i < ESD_MAX_KEY; i++)
|
||||
key[i] = (char)(rand() % 256);
|
||||
err = keyFile.Write(key, ESD_MAX_KEY);
|
||||
if (err < 0)
|
||||
return err;
|
||||
if (err < ESD_MAX_KEY)
|
||||
return EIO;
|
||||
}
|
||||
err = keyFile.Read(key, ESD_MAX_KEY);
|
||||
if (err < 0)
|
||||
return err;
|
||||
if (err < ESD_MAX_KEY)
|
||||
return EIO;
|
||||
memcpy(fAuthKey, key, sizeof(esd_key_t));
|
||||
return write(fSocket, fAuthKey, ESD_MAX_KEY);
|
||||
}
|
||||
|
||||
status_t ESDEndpoint::Connect(const char *host, uint16 port)
|
||||
{
|
||||
status_t err;
|
||||
CALLED();
|
||||
fHost = host;
|
||||
fPort = port;
|
||||
|
||||
struct hostent *he;
|
||||
struct sockaddr_in sin;
|
||||
he = gethostbyname(host);
|
||||
PRINT(("gethostbyname(%s) = %p\n", host, he));
|
||||
if (!he)
|
||||
return ENOENT;
|
||||
memcpy((struct in_addr *)&sin.sin_addr, he->h_addr, sizeof(struct in_addr));
|
||||
|
||||
fSocket = socket(AF_INET, SOCK_STREAM, 0);
|
||||
if (fSocket < 0)
|
||||
return errno;
|
||||
sin.sin_family = AF_INET;
|
||||
sin.sin_port = htons( port );
|
||||
|
||||
err = connect(fSocket, (struct sockaddr *) &sin, sizeof(sin));
|
||||
PRINT(("connect: %s\n", strerror(err)));
|
||||
if (err < 0)
|
||||
return errno;
|
||||
|
||||
/* uint32 cmd = ESD_CMD_CONNECT;
|
||||
err = write(fSocket, &cmd, sizeof(cmd));
|
||||
if (err < 0)
|
||||
return errno;
|
||||
if (err < sizeof(cmd))
|
||||
return EIO;
|
||||
*/
|
||||
err = SendAuthKey();
|
||||
if (err < 0)
|
||||
return errno;
|
||||
|
||||
bigtime_t ping = system_time();
|
||||
|
||||
uint32 endian = ESD_ENDIAN_TAG;
|
||||
err = write(fSocket, &endian, sizeof(endian));
|
||||
if (err < 0)
|
||||
return errno;
|
||||
if (err < sizeof(endian))
|
||||
return EIO;
|
||||
uint32 ok;
|
||||
|
||||
read(fSocket, &ok, sizeof(uint32));
|
||||
|
||||
ping = system_time() - ping;
|
||||
fLatency = ping;
|
||||
|
||||
int flag = 1;
|
||||
setsockopt(fSocket, IPPROTO_TCP, TCP_NODELAY, &flag, sizeof(flag));
|
||||
|
||||
// read(fSocket, &ok, sizeof(uint32));
|
||||
// connect
|
||||
// auth
|
||||
// ask server latency
|
||||
// calc network latency (time (send+recv) / 2) ?
|
||||
// get default format
|
||||
|
||||
return B_OK;
|
||||
}
|
||||
|
||||
status_t ESDEndpoint::Disconnect()
|
||||
{
|
||||
CALLED();
|
||||
if (fSocket > -1)
|
||||
closesocket(fSocket);
|
||||
fSocket = -1;
|
||||
return B_OK;
|
||||
}
|
||||
|
||||
status_t ESDEndpoint::SetCommand(esd_command_t cmd)
|
||||
{
|
||||
CALLED();
|
||||
if (fDefaultCommandSent)
|
||||
return EALREADY;
|
||||
fDefaultCommand = cmd;
|
||||
return B_OK;
|
||||
}
|
||||
|
||||
status_t ESDEndpoint::SetFormat(int bits, int channels, float rate)
|
||||
{
|
||||
esd_format_t fmt = 0;
|
||||
CALLED();
|
||||
if (fDefaultCommandSent)
|
||||
return EALREADY;
|
||||
PRINT(("SetFormat(%d,%d,%d)\n", bits, channels, rate));
|
||||
switch (bits) {
|
||||
case 8:
|
||||
fmt |= ESD_BITS8;
|
||||
break;
|
||||
case 16:
|
||||
fmt |= ESD_BITS16;
|
||||
break;
|
||||
default:
|
||||
return EINVAL;
|
||||
}
|
||||
switch (channels) {
|
||||
case 1:
|
||||
fmt |= ESD_MONO;
|
||||
break;
|
||||
case 2:
|
||||
fmt |= ESD_STEREO;
|
||||
break;
|
||||
default:
|
||||
return EINVAL;
|
||||
}
|
||||
fmt |= ESD_STREAM | ESD_FUNC_PLAY;
|
||||
PRINT(("SetFormat: %08lx\n", fmt));
|
||||
fDefaultFormat = fmt;
|
||||
fDefaultRate = rate;
|
||||
return B_OK;
|
||||
}
|
||||
|
||||
status_t ESDEndpoint::GetServerInfo()
|
||||
{
|
||||
CALLED();
|
||||
struct serverinfo {
|
||||
uint32 ver;
|
||||
uint32 rate;
|
||||
uint32 fmt;
|
||||
} si;
|
||||
status_t err;
|
||||
err = SendCommand(ESD_CMD_SERVER_INFO, (const uint8 *)&si, 0, (uint8 *)&si, sizeof(si));
|
||||
if (err < 0)
|
||||
return err;
|
||||
PRINT(("err %d, version: %lu, rate: %lu, fmt: %lu\n", err, si.ver, si.rate, si.fmt));
|
||||
return B_OK;
|
||||
}
|
||||
|
||||
bool ESDEndpoint::CanSend()
|
||||
{
|
||||
CALLED();
|
||||
return fDefaultCommandSent;
|
||||
}
|
||||
|
||||
ssize_t ESDEndpoint::Read(void *buffer, size_t size)
|
||||
{
|
||||
CALLED();
|
||||
return EINVAL;
|
||||
}
|
||||
|
||||
ssize_t ESDEndpoint::Write(const void *buffer, size_t size)
|
||||
{
|
||||
status_t err = B_OK;
|
||||
CALLED();
|
||||
if (!fDefaultCommandSent)
|
||||
err = SendDefaultCommand();
|
||||
if (err < B_OK)
|
||||
return err;
|
||||
//PRINT(("write(fSocket, buffer, %d)\n", size));
|
||||
//fprintf(stderr, "ESDEndpoint::Write(, %d) %s\n", size, (size%2)?"ODD BUFFER SIZE":"");
|
||||
if (fDefaultFormat & ESD_BITS16) {
|
||||
size /= 2;
|
||||
size *= 2;
|
||||
}
|
||||
err = write(fSocket, buffer, size);
|
||||
if (err != size) {
|
||||
fprintf(stderr, "ESDEndpoint::Write: sent only %d of %d!\n", err, size);
|
||||
}
|
||||
//PRINT(("write(fSocket, buffer, %d): %s\n", size, strerror(err)));
|
||||
if (err < B_OK)
|
||||
return errno;
|
||||
return err;
|
||||
}
|
||||
|
||||
status_t ESDEndpoint::SendCommand(esd_command_t cmd, const uint8 *obuf, size_t olen, uint8 *ibuf, size_t ilen)
|
||||
{
|
||||
status_t err;
|
||||
CALLED();
|
||||
err = send(fSocket, &cmd, sizeof(cmd), 0);
|
||||
if (err < B_OK)
|
||||
return errno;
|
||||
if (obuf && olen) {
|
||||
err = send(fSocket, obuf, olen, 0);
|
||||
if (err < B_OK)
|
||||
return errno;
|
||||
}
|
||||
err = B_OK;
|
||||
if (ibuf && ilen) {
|
||||
err = recv(fSocket, ibuf, ilen, 0);
|
||||
if (err < B_OK)
|
||||
return errno;
|
||||
/* return received len */
|
||||
}
|
||||
return err;
|
||||
}
|
||||
|
||||
status_t ESDEndpoint::SendDefaultCommand()
|
||||
{
|
||||
status_t err;
|
||||
struct {
|
||||
esd_format_t format;
|
||||
esd_rate_t rate;
|
||||
char name[ESD_MAX_NAME];
|
||||
} c;
|
||||
CALLED();
|
||||
if (fDefaultCommandSent)
|
||||
return EALREADY;
|
||||
c.format = fDefaultFormat;
|
||||
c.rate = fDefaultRate;
|
||||
strcpy(c.name, "BeOS/Haiku/ZETA Media Kit output");
|
||||
err = SendCommand(fDefaultCommand, (uint8 *)&c, sizeof(c), NULL, 0);
|
||||
if (err < B_OK)
|
||||
return err;
|
||||
PRINT(("SendCommand: %s\n", strerror(err)));
|
||||
fDefaultCommandSent = true;
|
||||
return B_OK;
|
||||
}
|
||||
|
||||
@@ -0,0 +1,84 @@
|
||||
/*
|
||||
* ESounD media addon for BeOS
|
||||
*
|
||||
* Copyright (c) 2006 François Revol ([email protected])
|
||||
*
|
||||
* Based on Multi Audio addon for Haiku,
|
||||
* Copyright (c) 2002, 2003 Jerome Duval ([email protected])
|
||||
*
|
||||
* All rights reserved.
|
||||
* Redistribution and use in source and binary forms, with or without modification,
|
||||
* are permitted provided that the following conditions are met:
|
||||
*
|
||||
* - Redistributions of source code must retain the above copyright notice,
|
||||
* this list of conditions and the following disclaimer.
|
||||
* - Redistributions in binary form must reproduce the above copyright notice,
|
||||
* this list of conditions and the following disclaimer in the documentation
|
||||
* and/or other materials provided with the distribution.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
|
||||
* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
|
||||
* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
|
||||
* EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
*/
|
||||
#ifndef ESDENDPOINT_H
|
||||
#define ESDENDPOINT_H
|
||||
|
||||
#include "esdproto.h"
|
||||
#include <DataIO.h>
|
||||
#include <String.h>
|
||||
|
||||
//#define ESD_FMT 8
|
||||
#define ESD_FMT 16
|
||||
|
||||
class ESDEndpoint : public BDataIO {
|
||||
public:
|
||||
ESDEndpoint();
|
||||
~ESDEndpoint();
|
||||
|
||||
/* */
|
||||
status_t SendAuthKey();
|
||||
status_t Connect(const char *host, uint16 port=ESD_PORT);
|
||||
status_t Disconnect();
|
||||
|
||||
/* set the default command and format for BDataIO interface */
|
||||
status_t SetCommand(esd_command_t cmd=ESD_CMD_STREAM_PLAY);
|
||||
status_t SetFormat(int bits, int channels, float rate=ESD_DEFAULT_RATE);
|
||||
|
||||
status_t GetServerInfo();
|
||||
|
||||
/* */
|
||||
|
||||
bigtime_t GetLatency() const { return fLatency; };
|
||||
|
||||
bool CanSend();
|
||||
|
||||
/* BDataIO */
|
||||
|
||||
virtual ssize_t Read(void *buffer, size_t size);
|
||||
virtual ssize_t Write(const void *buffer, size_t size);
|
||||
|
||||
status_t SendCommand(esd_command_t cmd, const uint8 *obuf, size_t olen, uint8 *ibuf, size_t ilen);
|
||||
status_t SendDefaultCommand();
|
||||
private:
|
||||
|
||||
BString fHost;
|
||||
uint16 fPort;
|
||||
int fSocket;
|
||||
esd_key_t fAuthKey;
|
||||
esd_command_t fDefaultCommand;
|
||||
bool fDefaultCommandSent;
|
||||
esd_format_t fDefaultFormat;
|
||||
esd_rate_t fDefaultRate;
|
||||
bigtime_t fLatency;
|
||||
};
|
||||
|
||||
|
||||
#endif /* ESDENDPOINT_H */
|
||||
@@ -0,0 +1,306 @@
|
||||
/*
|
||||
* ESounD media addon for BeOS
|
||||
*
|
||||
* Copyright (c) 2006 François Revol ([email protected])
|
||||
*
|
||||
* Based on Multi Audio addon for Haiku,
|
||||
* Copyright (c) 2002, 2003 Jerome Duval ([email protected])
|
||||
*
|
||||
* All rights reserved.
|
||||
* Redistribution and use in source and binary forms, with or without modification,
|
||||
* are permitted provided that the following conditions are met:
|
||||
*
|
||||
* - Redistributions of source code must retain the above copyright notice,
|
||||
* this list of conditions and the following disclaimer.
|
||||
* - Redistributions in binary form must reproduce the above copyright notice,
|
||||
* this list of conditions and the following disclaimer in the documentation
|
||||
* and/or other materials provided with the distribution.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
|
||||
* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
|
||||
* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
|
||||
* EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
*/
|
||||
#define _ZETA_TS_FIND_DIR_ 1
|
||||
#include <MediaDefs.h>
|
||||
#include <MediaAddOn.h>
|
||||
#include <Errors.h>
|
||||
#include <Node.h>
|
||||
#include <Mime.h>
|
||||
#include <StorageDefs.h>
|
||||
#include <Path.h>
|
||||
#include <Directory.h>
|
||||
#include <Entry.h>
|
||||
#include <FindDirectory.h>
|
||||
|
||||
#include "ESDSinkNode.h"
|
||||
#include "ESDSinkAddOn.h"
|
||||
#include "ESDEndpoint.h"
|
||||
|
||||
#include <limits.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
//#undef DEBUG
|
||||
//#define DEBUG 4
|
||||
#include "debug.h"
|
||||
#include <Debug.h>
|
||||
|
||||
//#define MULTI_SAVE
|
||||
|
||||
// instantiation function
|
||||
extern "C" _EXPORT BMediaAddOn * make_media_addon(image_id image) {
|
||||
CALLED();
|
||||
return new ESDSinkAddOn(image);
|
||||
}
|
||||
|
||||
// -------------------------------------------------------- //
|
||||
// ctor/dtor
|
||||
// -------------------------------------------------------- //
|
||||
|
||||
ESDSinkAddOn::~ESDSinkAddOn()
|
||||
{
|
||||
CALLED();
|
||||
|
||||
void *device = NULL;
|
||||
for ( int32 i = 0; (device = fDevices.ItemAt(i)); i++ )
|
||||
delete (ESDEndpoint *)device;
|
||||
|
||||
SaveSettings();
|
||||
}
|
||||
|
||||
ESDSinkAddOn::ESDSinkAddOn(image_id image) :
|
||||
BMediaAddOn(image),
|
||||
fDevices()
|
||||
{
|
||||
CALLED();
|
||||
fInitCheckStatus = B_NO_INIT;
|
||||
|
||||
LoadSettings();
|
||||
|
||||
if(SetupDefaultSinks()!=B_OK)
|
||||
return;
|
||||
|
||||
fInitCheckStatus = B_OK;
|
||||
}
|
||||
|
||||
// -------------------------------------------------------- //
|
||||
// BMediaAddOn impl
|
||||
// -------------------------------------------------------- //
|
||||
|
||||
status_t ESDSinkAddOn::InitCheck(
|
||||
const char ** out_failure_text)
|
||||
{
|
||||
CALLED();
|
||||
return B_OK;
|
||||
}
|
||||
|
||||
int32 ESDSinkAddOn::CountFlavors()
|
||||
{
|
||||
CALLED();
|
||||
//return fDevices.CountItems();
|
||||
return 1;
|
||||
}
|
||||
|
||||
status_t ESDSinkAddOn::GetFlavorAt(
|
||||
int32 n,
|
||||
const flavor_info ** out_info)
|
||||
{
|
||||
CALLED();
|
||||
if (out_info == 0) {
|
||||
fprintf(stderr,"<- B_BAD_VALUE\n");
|
||||
return B_BAD_VALUE; // we refuse to crash because you were stupid
|
||||
}
|
||||
//if (n < 0 || n > fDevices.CountItems() - 1) {
|
||||
if (n < 0 || n > 1) {
|
||||
fprintf(stderr,"<- B_BAD_INDEX\n");
|
||||
return B_BAD_INDEX;
|
||||
}
|
||||
|
||||
ESDEndpoint *device = (ESDEndpoint *) fDevices.ItemAt(n);
|
||||
|
||||
flavor_info * infos = new flavor_info[1];
|
||||
ESDSinkNode::GetFlavor(&infos[0], n);
|
||||
// infos[0].name = device->MD.friendly_name;
|
||||
infos[0].name = "ESounD Out";
|
||||
(*out_info) = infos;
|
||||
return B_OK;
|
||||
}
|
||||
|
||||
BMediaNode * ESDSinkAddOn::InstantiateNodeFor(
|
||||
const flavor_info * info,
|
||||
BMessage * config,
|
||||
status_t * out_error)
|
||||
{
|
||||
CALLED();
|
||||
if (out_error == 0) {
|
||||
fprintf(stderr,"<- NULL\n");
|
||||
return 0; // we refuse to crash because you were stupid
|
||||
}
|
||||
|
||||
BMessage defaults;
|
||||
if (!config)
|
||||
config = &defaults;
|
||||
|
||||
#ifdef MULTI_SAVE
|
||||
if(fSettings.FindMessage(device->MD.friendly_name, config)==B_OK) {
|
||||
fSettings.RemoveData(device->MD.friendly_name);
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
ESDSinkNode * node
|
||||
= new ESDSinkNode(this,
|
||||
"ESounD Sink",
|
||||
config);
|
||||
if (node == 0) {
|
||||
*out_error = B_NO_MEMORY;
|
||||
fprintf(stderr,"<- B_NO_MEMORY\n");
|
||||
} else {
|
||||
*out_error = node->InitCheck();
|
||||
}
|
||||
return node;
|
||||
}
|
||||
|
||||
status_t
|
||||
ESDSinkAddOn::GetConfigurationFor(BMediaNode * your_node, BMessage * into_message)
|
||||
{
|
||||
CALLED();
|
||||
#ifdef MULTI_SAVE
|
||||
if (into_message == 0) {
|
||||
into_message = new BMessage();
|
||||
ESDSinkNode * node = dynamic_cast<ESDSinkNode*>(your_node);
|
||||
if (node == 0) {
|
||||
fprintf(stderr,"<- B_BAD_TYPE\n");
|
||||
return B_BAD_TYPE;
|
||||
}
|
||||
if(node->GetConfigurationFor(into_message)==B_OK) {
|
||||
fSettings.AddMessage(your_node->Name(), into_message);
|
||||
}
|
||||
return B_OK;
|
||||
}
|
||||
#endif
|
||||
// currently never called by the media kit. Seems it is not implemented.
|
||||
if (into_message == 0) {
|
||||
fprintf(stderr,"<- B_BAD_VALUE\n");
|
||||
return B_BAD_VALUE; // we refuse to crash because you were stupid
|
||||
}
|
||||
ESDSinkNode * node = dynamic_cast<ESDSinkNode*>(your_node);
|
||||
if (node == 0) {
|
||||
fprintf(stderr,"<- B_BAD_TYPE\n");
|
||||
return B_BAD_TYPE;
|
||||
}
|
||||
return node->GetConfigurationFor(into_message);
|
||||
}
|
||||
|
||||
#if 0
|
||||
bool ESDSinkAddOn::WantsAutoStart()
|
||||
{
|
||||
CALLED();
|
||||
return true;//false;
|
||||
}
|
||||
|
||||
status_t ESDSinkAddOn::AutoStart(
|
||||
int in_count,
|
||||
BMediaNode ** out_node,
|
||||
int32 * out_internal_id,
|
||||
bool * out_has_more)
|
||||
{
|
||||
CALLED();
|
||||
const flavor_info *fi;
|
||||
status_t err;
|
||||
|
||||
// XXX: LEAK!
|
||||
PRINT(("AutoStart: in_count=%d\n", in_count));
|
||||
// if (in_count < 1)
|
||||
// return EINVAL;
|
||||
*out_internal_id = 0;
|
||||
*out_has_more = false;
|
||||
err = GetFlavorAt(0, (const flavor_info **)&fi);
|
||||
if (err < 0)
|
||||
return err;
|
||||
*out_node = InstantiateNodeFor((const flavor_info *)fi, NULL, &err);
|
||||
delete fi;
|
||||
if (err < 0)
|
||||
return err;
|
||||
return B_OK+1;
|
||||
}
|
||||
#endif
|
||||
|
||||
status_t
|
||||
ESDSinkAddOn::SetupDefaultSinks()
|
||||
{
|
||||
CALLED();
|
||||
#if 0
|
||||
BDirectory root;
|
||||
if(rootEntry!=NULL)
|
||||
root.SetTo(rootEntry);
|
||||
else if(rootPath!=NULL) {
|
||||
root.SetTo(rootPath);
|
||||
} else {
|
||||
PRINT(("Error in ESDSinkAddOn::RecursiveScan null params\n"));
|
||||
return B_ERROR;
|
||||
}
|
||||
|
||||
BEntry entry;
|
||||
|
||||
while(root.GetNextEntry(&entry) > B_ERROR) {
|
||||
|
||||
if(entry.IsDirectory()) {
|
||||
RecursiveScan(rootPath, &entry);
|
||||
} else {
|
||||
BPath path;
|
||||
entry.GetPath(&path);
|
||||
ESDEndpoint *device = new ESDEndpoint(path.Path() + strlen(rootPath), path.Path());
|
||||
if (device) {
|
||||
if (device->InitCheck() == B_OK)
|
||||
fDevices.AddItem(device);
|
||||
else
|
||||
delete device;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#endif
|
||||
return B_OK;
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
ESDSinkAddOn::SaveSettings(void)
|
||||
{
|
||||
CALLED();
|
||||
BPath path;
|
||||
if(find_directory(B_USER_SETTINGS_DIRECTORY, &path) == B_OK) {
|
||||
path.Append(SETTINGS_FILE);
|
||||
BFile file(path.Path(),B_READ_WRITE|B_CREATE_FILE|B_ERASE_FILE);
|
||||
if(file.InitCheck()==B_OK)
|
||||
fSettings.Flatten(&file);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
ESDSinkAddOn::LoadSettings(void)
|
||||
{
|
||||
CALLED();
|
||||
fSettings.MakeEmpty();
|
||||
|
||||
BPath path;
|
||||
if(find_directory(B_USER_SETTINGS_DIRECTORY, &path) == B_OK) {
|
||||
path.Append(SETTINGS_FILE);
|
||||
BFile file(path.Path(),B_READ_ONLY);
|
||||
if((file.InitCheck()==B_OK)&&(fSettings.Unflatten(&file)==B_OK))
|
||||
{
|
||||
//fSettings.PrintToStream();
|
||||
} else {
|
||||
PRINT(("Error unflattening settings file %s\n",path.Path()));
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,87 @@
|
||||
/*
|
||||
* ESounD media addon for BeOS
|
||||
*
|
||||
* Copyright (c) 2006 François Revol ([email protected])
|
||||
*
|
||||
* Based on Multi Audio addon for Haiku,
|
||||
* Copyright (c) 2002, 2003 Jerome Duval ([email protected])
|
||||
*
|
||||
* All rights reserved.
|
||||
* Redistribution and use in source and binary forms, with or without modification,
|
||||
* are permitted provided that the following conditions are met:
|
||||
*
|
||||
* - Redistributions of source code must retain the above copyright notice,
|
||||
* this list of conditions and the following disclaimer.
|
||||
* - Redistributions in binary form must reproduce the above copyright notice,
|
||||
* this list of conditions and the following disclaimer in the documentation
|
||||
* and/or other materials provided with the distribution.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
|
||||
* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
|
||||
* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
|
||||
* EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
*/
|
||||
#ifndef _ESDSINK_ADDON_H
|
||||
#define _ESDSINK_ADDON_H
|
||||
|
||||
#include <MediaDefs.h>
|
||||
#include <MediaAddOn.h>
|
||||
|
||||
#define SETTINGS_FILE "Media/esd_sink_settings"
|
||||
|
||||
class ESDSinkAddOn :
|
||||
public BMediaAddOn
|
||||
{
|
||||
public:
|
||||
virtual ~ESDSinkAddOn(void);
|
||||
explicit ESDSinkAddOn(image_id image);
|
||||
|
||||
/**************************/
|
||||
/* begin from BMediaAddOn */
|
||||
public:
|
||||
virtual status_t InitCheck(
|
||||
const char ** out_failure_text);
|
||||
virtual int32 CountFlavors(void);
|
||||
virtual status_t GetFlavorAt(
|
||||
int32 n,
|
||||
const flavor_info ** out_info);
|
||||
virtual BMediaNode * InstantiateNodeFor(
|
||||
const flavor_info * info,
|
||||
BMessage * config,
|
||||
status_t * out_error);
|
||||
virtual status_t GetConfigurationFor(
|
||||
BMediaNode * your_node,
|
||||
BMessage * into_message);
|
||||
/*
|
||||
virtual bool WantsAutoStart(void);
|
||||
virtual status_t AutoStart(
|
||||
int in_count,
|
||||
BMediaNode ** out_node,
|
||||
int32 * out_internal_id,
|
||||
bool * out_has_more);
|
||||
*/
|
||||
|
||||
/* end from BMediaAddOn */
|
||||
/************************/
|
||||
|
||||
private:
|
||||
status_t SetupDefaultSinks();
|
||||
void SaveSettings();
|
||||
void LoadSettings();
|
||||
|
||||
status_t fInitCheckStatus;
|
||||
BList fDevices;
|
||||
|
||||
BMessage fSettings; // settings loaded from settings directory
|
||||
};
|
||||
|
||||
extern "C" _EXPORT BMediaAddOn *make_media_addon( image_id you );
|
||||
|
||||
#endif /* _ESDSINK_ADDON_H */
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,364 @@
|
||||
/*
|
||||
* ESounD media addon for BeOS
|
||||
*
|
||||
* Copyright (c) 2006 François Revol ([email protected])
|
||||
*
|
||||
* Based on Multi Audio addon for Haiku,
|
||||
* Copyright (c) 2002, 2003 Jerome Duval ([email protected])
|
||||
*
|
||||
* All rights reserved.
|
||||
* Redistribution and use in source and binary forms, with or without modification,
|
||||
* are permitted provided that the following conditions are met:
|
||||
*
|
||||
* - Redistributions of source code must retain the above copyright notice,
|
||||
* this list of conditions and the following disclaimer.
|
||||
* - Redistributions in binary form must reproduce the above copyright notice,
|
||||
* this list of conditions and the following disclaimer in the documentation
|
||||
* and/or other materials provided with the distribution.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
|
||||
* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
|
||||
* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
|
||||
* EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
*/
|
||||
#ifndef _ESDSINK_NODE_H
|
||||
#define _ESDSINK_NODE_H
|
||||
|
||||
#include <MediaDefs.h>
|
||||
#include <MediaNode.h>
|
||||
#include <FileInterface.h>
|
||||
#include <BufferConsumer.h>
|
||||
#include <BufferProducer.h>
|
||||
#include <Controllable.h>
|
||||
#include <MediaEventLooper.h>
|
||||
#include <ParameterWeb.h>
|
||||
#include <TimeSource.h>
|
||||
#include <Controllable.h>
|
||||
#include <File.h>
|
||||
#include <Entry.h>
|
||||
#include "ESDEndpoint.h"
|
||||
|
||||
//#define ENABLE_INPUT 1
|
||||
//#define ENABLE_TS 1
|
||||
|
||||
/*bool format_is_acceptible(
|
||||
const media_format & producer_format,
|
||||
const media_format & consumer_format);*/
|
||||
|
||||
class ESDSinkNode :
|
||||
public BBufferConsumer,
|
||||
#if ENABLE_INPUT
|
||||
public BBufferProducer,
|
||||
#endif
|
||||
#ifdef ENABLE_TS
|
||||
public BTimeSource,
|
||||
#endif
|
||||
public BMediaEventLooper,
|
||||
public BControllable
|
||||
{
|
||||
protected:
|
||||
virtual ~ESDSinkNode(void);
|
||||
|
||||
public:
|
||||
|
||||
explicit ESDSinkNode(BMediaAddOn *addon, char* name, BMessage * config);
|
||||
|
||||
virtual status_t InitCheck(void) const;
|
||||
|
||||
/*************************/
|
||||
/* begin from BMediaNode */
|
||||
public:
|
||||
virtual BMediaAddOn* AddOn(
|
||||
int32 * internal_id) const; /* Who instantiated you -- or NULL for app class */
|
||||
|
||||
protected:
|
||||
/* These don't return errors; instead, they use the global error condition reporter. */
|
||||
/* A node is required to have a queue of at least one pending command (plus TimeWarp) */
|
||||
/* and is recommended to allow for at least one pending command of each type. */
|
||||
/* Allowing an arbitrary number of outstanding commands might be nice, but apps */
|
||||
/* cannot depend on that happening. */
|
||||
virtual void Preroll(void);
|
||||
|
||||
public:
|
||||
virtual status_t HandleMessage(
|
||||
int32 message,
|
||||
const void * data,
|
||||
size_t size);
|
||||
|
||||
protected:
|
||||
virtual void NodeRegistered(void); /* reserved 2 */
|
||||
virtual status_t RequestCompleted(const media_request_info &info);
|
||||
virtual void SetTimeSource(BTimeSource *timeSource);
|
||||
|
||||
/* end from BMediaNode */
|
||||
/***********************/
|
||||
|
||||
/******************************/
|
||||
/* begin from BBufferConsumer */
|
||||
|
||||
//included from BMediaAddOn
|
||||
//virtual status_t HandleMessage(
|
||||
// int32 message,
|
||||
// const void * data,
|
||||
// size_t size);
|
||||
|
||||
/* Someone, probably the producer, is asking you about this format. Give */
|
||||
/* your honest opinion, possibly modifying *format. Do not ask upstream */
|
||||
/* producer about the format, since he's synchronously waiting for your */
|
||||
/* reply. */
|
||||
virtual status_t AcceptFormat(
|
||||
const media_destination & dest,
|
||||
media_format * format);
|
||||
virtual status_t GetNextInput(
|
||||
int32 * cookie,
|
||||
media_input * out_input);
|
||||
virtual void DisposeInputCookie(
|
||||
int32 cookie);
|
||||
virtual void BufferReceived(
|
||||
BBuffer * buffer);
|
||||
virtual void ProducerDataStatus(
|
||||
const media_destination & for_whom,
|
||||
int32 status,
|
||||
bigtime_t at_performance_time);
|
||||
virtual status_t GetLatencyFor(
|
||||
const media_destination & for_whom,
|
||||
bigtime_t * out_latency,
|
||||
media_node_id * out_timesource);
|
||||
virtual status_t Connected(
|
||||
const media_source & producer, /* here's a good place to request buffer group usage */
|
||||
const media_destination & where,
|
||||
const media_format & with_format,
|
||||
media_input * out_input);
|
||||
virtual void Disconnected(
|
||||
const media_source & producer,
|
||||
const media_destination & where);
|
||||
/* The notification comes from the upstream producer, so he's already cool with */
|
||||
/* the format; you should not ask him about it in here. */
|
||||
virtual status_t FormatChanged(
|
||||
const media_source & producer,
|
||||
const media_destination & consumer,
|
||||
int32 change_tag,
|
||||
const media_format & format);
|
||||
|
||||
/* Given a performance time of some previous buffer, retrieve the remembered tag */
|
||||
/* of the closest (previous or exact) performance time. Set *out_flags to 0; the */
|
||||
/* idea being that flags can be added later, and the understood flags returned in */
|
||||
/* *out_flags. */
|
||||
virtual status_t SeekTagRequested(
|
||||
const media_destination & destination,
|
||||
bigtime_t in_target_time,
|
||||
uint32 in_flags,
|
||||
media_seek_tag * out_seek_tag,
|
||||
bigtime_t * out_tagged_time,
|
||||
uint32 * out_flags);
|
||||
|
||||
/* end from BBufferConsumer */
|
||||
/****************************/
|
||||
|
||||
/******************************/
|
||||
/* begin from BBufferProducer */
|
||||
#if 0
|
||||
virtual status_t FormatSuggestionRequested( media_type type,
|
||||
int32 quality,
|
||||
media_format* format);
|
||||
|
||||
virtual status_t FormatProposal( const media_source& output,
|
||||
media_format* format);
|
||||
|
||||
virtual status_t FormatChangeRequested( const media_source& source,
|
||||
const media_destination& destination,
|
||||
media_format* io_format,
|
||||
int32* _deprecated_);
|
||||
virtual status_t GetNextOutput( int32* cookie,
|
||||
media_output* out_output);
|
||||
virtual status_t DisposeOutputCookie( int32 cookie);
|
||||
|
||||
virtual status_t SetBufferGroup( const media_source& for_source,
|
||||
BBufferGroup* group);
|
||||
|
||||
virtual status_t PrepareToConnect( const media_source& what,
|
||||
const media_destination& where,
|
||||
media_format* format,
|
||||
media_source* out_source,
|
||||
char* out_name);
|
||||
|
||||
virtual void Connect( status_t error,
|
||||
const media_source& source,
|
||||
const media_destination& destination,
|
||||
const media_format& format,
|
||||
char* io_name);
|
||||
|
||||
virtual void Disconnect( const media_source& what,
|
||||
const media_destination& where);
|
||||
|
||||
virtual void LateNoticeReceived( const media_source& what,
|
||||
bigtime_t how_much,
|
||||
bigtime_t performance_time);
|
||||
|
||||
virtual void EnableOutput( const media_source & what,
|
||||
bool enabled,
|
||||
int32* _deprecated_);
|
||||
virtual void AdditionalBufferRequested( const media_source& source,
|
||||
media_buffer_id prev_buffer,
|
||||
bigtime_t prev_time,
|
||||
const media_seek_tag* prev_tag);
|
||||
#endif
|
||||
/* end from BBufferProducer */
|
||||
/****************************/
|
||||
|
||||
/*****************/
|
||||
/* BControllable */
|
||||
/*****************/
|
||||
|
||||
/********************************/
|
||||
/* start from BMediaEventLooper */
|
||||
|
||||
protected:
|
||||
/* you must override to handle your events! */
|
||||
/* you should not call HandleEvent directly */
|
||||
virtual void HandleEvent( const media_timed_event *event,
|
||||
bigtime_t lateness,
|
||||
bool realTimeEvent = false);
|
||||
|
||||
/* end from BMediaEventLooper */
|
||||
/******************************/
|
||||
|
||||
/********************************/
|
||||
/* start from BTimeSource */
|
||||
#ifdef ENABLE_TS
|
||||
protected:
|
||||
virtual void SetRunMode( run_mode mode);
|
||||
virtual status_t TimeSourceOp( const time_source_op_info &op,
|
||||
void *_reserved);
|
||||
#endif
|
||||
/* end from BTimeSource */
|
||||
/******************************/
|
||||
|
||||
/********************************/
|
||||
/* start from BControllable */
|
||||
protected:
|
||||
virtual status_t GetParameterValue( int32 id,
|
||||
bigtime_t* last_change,
|
||||
void* value,
|
||||
size_t* ioSize);
|
||||
virtual void SetParameterValue( int32 id,
|
||||
bigtime_t when,
|
||||
const void* value,
|
||||
size_t size);
|
||||
virtual BParameterWeb* MakeParameterWeb();
|
||||
|
||||
/* end from BControllable */
|
||||
/******************************/
|
||||
|
||||
protected:
|
||||
|
||||
virtual status_t HandleStart(
|
||||
const media_timed_event *event,
|
||||
bigtime_t lateness,
|
||||
bool realTimeEvent = false);
|
||||
virtual status_t HandleSeek(
|
||||
const media_timed_event *event,
|
||||
bigtime_t lateness,
|
||||
bool realTimeEvent = false);
|
||||
virtual status_t HandleWarp(
|
||||
const media_timed_event *event,
|
||||
bigtime_t lateness,
|
||||
bool realTimeEvent = false);
|
||||
virtual status_t HandleStop(
|
||||
const media_timed_event *event,
|
||||
bigtime_t lateness,
|
||||
bool realTimeEvent = false);
|
||||
virtual status_t HandleBuffer(
|
||||
const media_timed_event *event,
|
||||
bigtime_t lateness,
|
||||
bool realTimeEvent = false);
|
||||
virtual status_t HandleDataStatus(
|
||||
const media_timed_event *event,
|
||||
bigtime_t lateness,
|
||||
bool realTimeEvent = false);
|
||||
virtual status_t HandleParameter(
|
||||
const media_timed_event *event,
|
||||
bigtime_t lateness,
|
||||
bool realTimeEvent = false);
|
||||
|
||||
public:
|
||||
|
||||
static void GetFlavor(flavor_info * outInfo, int32 id);
|
||||
static void GetFormat(media_format * outFormat);
|
||||
|
||||
status_t GetConfigurationFor(BMessage * into_message);
|
||||
|
||||
|
||||
private:
|
||||
|
||||
ESDSinkNode( /* private unimplemented */
|
||||
const ESDSinkNode & clone);
|
||||
ESDSinkNode & operator=(
|
||||
const ESDSinkNode & clone);
|
||||
|
||||
#if 0
|
||||
|
||||
void AllocateBuffers(node_output &channel);
|
||||
BBuffer* FillNextBuffer( multi_buffer_info &MBI,
|
||||
node_output &channel);
|
||||
void UpdateTimeSource(multi_buffer_info &MBI,
|
||||
multi_buffer_info &oldMBI,
|
||||
node_input &input);
|
||||
#endif
|
||||
// node_output* FindOutput(media_source source);
|
||||
// node_input* FindInput(media_destination dest);
|
||||
// node_input* FindInput(int32 destinationId);
|
||||
|
||||
// void ProcessGroup(BParameterGroup *group, int32 index, int32 &nbParameters);
|
||||
// void ProcessMux(BDiscreteParameter *parameter, int32 index);
|
||||
|
||||
status_t fInitCheckStatus;
|
||||
|
||||
BMediaAddOn *fAddOn;
|
||||
int32 fId;
|
||||
|
||||
BList fInputs;
|
||||
media_input fInput;
|
||||
|
||||
bigtime_t fLatency;
|
||||
BList fOutputs;
|
||||
media_output fOutput;
|
||||
media_format fPreferredFormat;
|
||||
|
||||
bigtime_t fInternalLatency;
|
||||
// this is computed from the real (negotiated) chunk size and bit rate,
|
||||
// not the defaults that are in the parameters
|
||||
bigtime_t fBufferPeriod;
|
||||
|
||||
|
||||
//volatile uint32 fBufferCycle;
|
||||
sem_id fBuffer_free;
|
||||
|
||||
|
||||
thread_id fThread;
|
||||
|
||||
BString fHostname;
|
||||
ESDEndpoint *fDevice;
|
||||
|
||||
//multi_description MD;
|
||||
//multi_format_info MFI;
|
||||
//multi_buffer_list MBL;
|
||||
|
||||
//multi_mix_control_info MMCI;
|
||||
//multi_mix_control MMC[MAX_CONTROLS];
|
||||
|
||||
bool fTimeSourceStarted;
|
||||
|
||||
BParameterWeb *fWeb;
|
||||
|
||||
BMessage fConfig;
|
||||
};
|
||||
|
||||
#endif /* _ESDSINK_NODE_H */
|
||||
@@ -0,0 +1,279 @@
|
||||
EsounD Protocol (Draft)
|
||||
Author: ymnk<[email protected]>
|
||||
Data: 2000-10-02
|
||||
===============
|
||||
|
||||
Introduction
|
||||
------------
|
||||
This document describes the protocol in EsounD system.
|
||||
Unfortunately, any formal description about EsounD had not existed.
|
||||
So the author has tried to read the source code of EsounD and written this
|
||||
document. The author is also the author of JEsd, which is a re-implementation
|
||||
of EsounD in pure Java and this document is based on his knowledge,
|
||||
which had gotten in hacking JEsd.
|
||||
|
||||
|
||||
Connection Setup
|
||||
----------------
|
||||
The esd will wait for the TCP connection requests from EsounD compatible
|
||||
applications. In the default, esd will listen to the TCP port 16001.
|
||||
The client must send an initial byte of data to be authorized them-self
|
||||
and to identify the byte order to be employed.
|
||||
For authorization, client must send 'esd-key', which is a 16 byte data.
|
||||
For endian-ness, client must send a 4 byte data.
|
||||
If esd does not detect any error, '1' will be sent back and
|
||||
'0' will be sent back in error.
|
||||
|
||||
Requests
|
||||
--------
|
||||
lock:
|
||||
esd-key:ESDKEY
|
||||
w result:BOOLEAN
|
||||
|
||||
At first, esd will check if the client has the right to lock the device
|
||||
by esd-key. If that client has the right to do so, esd will lock the device
|
||||
and send back true. If not, false will be sent back
|
||||
|
||||
unlock:
|
||||
esd-key:ESDKEY
|
||||
w result:BOOLEAN
|
||||
|
||||
At first, esd will check if the client has the right to unlock the device
|
||||
by esd-key. If that client has the right to do so, esd will unlock the
|
||||
device and send back true. If not, false will be sent back
|
||||
|
||||
...
|
||||
|
||||
|
||||
|
||||
Syntactic Conventions
|
||||
--------------------
|
||||
All numbers are in decimal, unless prefixed with '0x', in which case
|
||||
they are in hexadecimal(base 16).
|
||||
|
||||
The general syntax used to describe data packets is:
|
||||
Name:
|
||||
encoded-form
|
||||
...
|
||||
encoded-form
|
||||
|
||||
For components described in the protocol descriptions as:
|
||||
name: TYPE
|
||||
w name: TYPE
|
||||
the encode-form are:
|
||||
N TYPE name
|
||||
and
|
||||
w N TYPE name
|
||||
N is the number of bytes in the data stream, and TYPE is the interpretation
|
||||
of those bytes. For example,
|
||||
result: BOOLEAN
|
||||
becomes:
|
||||
4 BOOLEAN result
|
||||
|
||||
For components with a static numeric value the encode-form is:
|
||||
N value name
|
||||
The value is always interpreted as a N-byte unsigned integer.
|
||||
|
||||
|
||||
Data Types
|
||||
----------
|
||||
CARD8: A single byte unsigned integer.
|
||||
CARD32: 32-bit unsigned integer
|
||||
ARRAY8: A collection of CARD8.
|
||||
ARRAY8(n): This is a ARRAY8, which includes 'n' elements.
|
||||
ENDIAN: This is a ARRAY8(4), which includes 'ENDN' or 'NDNE'.
|
||||
If the first element is 'E', data from clients is in big-endian.
|
||||
BOOLEAN: This is a CARD32 and includes '0' or '1'. '1' means true.
|
||||
ESDKEY: This is a ARRAY8(16), which includes 'esd-key'.
|
||||
ESDNAME: This is a ARRAY8(128), which includes 'esd-name'.
|
||||
ESDSTREAM: This is a infinite ARRAY8.
|
||||
FORMAT: This is a CARD32. Each bits in this data has following semantics,
|
||||
(format&0x000f)==0x0000 8bit data
|
||||
(format&0x000f)==0x0001 16bit data
|
||||
(format&0x00f0)==0x0010 mono
|
||||
(format&0x00f0)==0x0020 stereo
|
||||
(format&0x0f00)==0x0000 stream
|
||||
(format&0x0f00)==0x0100 sample
|
||||
(format&0x0f00)==0x0200 ADPCM
|
||||
(format&0xf000)==0x1000 play
|
||||
(format&0xf000)==0x0000 monitor for streams, stop for samples
|
||||
(format&0xf000)==0x2000 record for streams, loop for samples
|
||||
MODE: This is a CARD32, which is '0', '1', '2' or '3'.
|
||||
0 ERROR
|
||||
1 STANDBY
|
||||
2 AUTOSTANDBY
|
||||
3 RUNNING
|
||||
|
||||
|
||||
Packet Format
|
||||
-------------
|
||||
init:
|
||||
4 0 opcode
|
||||
16 ESDKEY esd-key
|
||||
4 ENDIAN 'ENDN' or 'NDNE'
|
||||
w 4 BOOLEAN 0 or 1
|
||||
|
||||
|
||||
lock:
|
||||
4 1 opcode
|
||||
16 ESDKEY esd-key
|
||||
4 ENDIAN unused
|
||||
w 4 BOOLEAN 0 or 1
|
||||
|
||||
unlock:
|
||||
4 2 opcode
|
||||
16 ESDKEY esd-key
|
||||
4 ENDIAN unused
|
||||
w 4 BOOLEAN 0 or 1
|
||||
|
||||
stream-play:
|
||||
4 3 opcode
|
||||
4 FORMAT format
|
||||
4 CARD32 rate
|
||||
128 ESDNAME name
|
||||
? ESDSTREAM stream of PCM sound
|
||||
|
||||
//stream-mon: This protocol is not used for the remote esd.
|
||||
// 4 4 opcode
|
||||
// 4 FORMA format
|
||||
// 4 CARD3 rate
|
||||
// 128 ESDNAME name
|
||||
// w ? ESDSTREAM stream of PCM sound
|
||||
|
||||
stream-mon:
|
||||
4 5 opcode
|
||||
4 FORMAT format
|
||||
4 CARD32 rate
|
||||
128 ESDNAME name
|
||||
w ? ESDSTREAM stream of PCM sound
|
||||
|
||||
sample-cache:
|
||||
4 6 opcode
|
||||
4 FORMAT format
|
||||
4 CARD32 rate
|
||||
4 n size
|
||||
128 ESDNAME name
|
||||
w 4 CARD32 sample-id
|
||||
n ARRAY8(n) stream of PCM sound
|
||||
w 4 CARD32 sample-id
|
||||
|
||||
sample-free:
|
||||
4 7 opcode
|
||||
4 CARD32 sample-id
|
||||
w 4 CARD32 sample-id
|
||||
|
||||
sample-play:
|
||||
4 8 opcode
|
||||
4 CARD32 sample-id
|
||||
w 4 CARD32 sample-id
|
||||
|
||||
sample-loop:
|
||||
4 9 opcode
|
||||
4 CARD32 sample-id
|
||||
w 4 CARD32 sample-id
|
||||
|
||||
sample-stop:
|
||||
4 10 opcode
|
||||
4 CARD32 sample-id
|
||||
w 4 CARD32 sample-id
|
||||
|
||||
sample-kill:
|
||||
4 11 opcode
|
||||
4 CARD32 sample-id
|
||||
w 4 CARD32 sample-id
|
||||
|
||||
standby:
|
||||
4 12 opcode
|
||||
16 ESDKEY esd-key
|
||||
4 ENDIAN unused
|
||||
w 4 BOOLEAN 0 or 1
|
||||
|
||||
resume:
|
||||
4 13 opcode
|
||||
16 ESDKEY esd-key
|
||||
4 ENDIAN unused
|
||||
w 4 BOOLEAN 0 or 1
|
||||
|
||||
sample-getid:
|
||||
4 14 opcode
|
||||
128 ESDNAME name
|
||||
w 4 CARD32 sample-id
|
||||
|
||||
stream-filter:
|
||||
4 15 opcode
|
||||
4 FORMAT format
|
||||
4 CARD32 rate
|
||||
128 ESDNAME name
|
||||
w 4 BOOLEAN 0 or 1
|
||||
|
||||
server-info:
|
||||
4 16 opcode
|
||||
w 4 CARD32 version
|
||||
w 4 CARD32 rate
|
||||
w 4 FORMAT format
|
||||
|
||||
server-all-info:
|
||||
4 17 opcode
|
||||
w 4 CARD32 version
|
||||
w 4 CARD32 rate
|
||||
w 4 FORMAT format
|
||||
w ? STREAMINFO
|
||||
w ? SAMPLEINFO
|
||||
|
||||
STREAMINFO:
|
||||
except for last in series
|
||||
w 4 CARD32 id
|
||||
w 16 ESDNAME name
|
||||
w 4 CARD32 rate
|
||||
w 4 CARD32 left-vol-scale
|
||||
w 4 CARD32 right-vol-scale
|
||||
w 4 FORMAT format
|
||||
last in series
|
||||
w 4 CARD32 0
|
||||
w 32 ARRAY8(32) unused
|
||||
|
||||
|
||||
SAMPLEINFO:
|
||||
except for last in series
|
||||
w 4 CARD32 id
|
||||
w 16 ESDNAME name
|
||||
w 4 CARD32 rate
|
||||
w 4 CARD32 left-vol-scale
|
||||
w 4 CARD32 right-vol-scale
|
||||
w 4 FORMAT format
|
||||
w 4 CARD32 sample-length
|
||||
last in series
|
||||
w 4 CARD32 0
|
||||
w 36 ARRAY8(36) unused
|
||||
|
||||
|
||||
//subscribe: undefined
|
||||
// 4 18 opcode
|
||||
|
||||
//unsubjcribe: undefined
|
||||
// 4 19 opcode
|
||||
|
||||
stream-pan:
|
||||
4 20 opcode
|
||||
4 CARD32 stream-id
|
||||
4 CARD32 left-scale
|
||||
4 CARD32 right-scale
|
||||
w 4 BOOLEAN 0 or 1
|
||||
|
||||
sample-pan:
|
||||
4 21 opcode
|
||||
4 CARD32 sample-id
|
||||
4 CARD32 left-scale
|
||||
4 CARD32 right-scale
|
||||
w 4 BOOLEAN 0 or 1
|
||||
|
||||
|
||||
standby-mode:
|
||||
4 22 opcode
|
||||
4 0 version
|
||||
w 4 MODE mode
|
||||
w 4 BOOLEAN 0 or 1
|
||||
|
||||
latency:
|
||||
4 23 opcode
|
||||
w 4 CARD32 latency
|
||||
@@ -0,0 +1,20 @@
|
||||
SubDir HAIKU_TOP src add-ons media media-add-ons esound_sink ;
|
||||
|
||||
SetSubDirSupportedPlatformsBeOSCompatible ;
|
||||
|
||||
if $(TARGET_PLATFORM) != haiku {
|
||||
SubDirC++Flags -fmultiple-symbol-spaces ;
|
||||
}
|
||||
|
||||
Addon ESDSink.media_addon : media :
|
||||
ESDEndpoint.cpp
|
||||
ESDSinkAddOn.cpp
|
||||
ESDSinkNode.cpp
|
||||
: false
|
||||
: be media
|
||||
;
|
||||
|
||||
#Package haiku-multi_audio-cvs
|
||||
# : hmulti_audio.media_addon
|
||||
# : boot home config add-ons media ;
|
||||
|
||||
@@ -0,0 +1,26 @@
|
||||
|
||||
#ifndef _COMPAT_H
|
||||
#define _COMPAT_H
|
||||
|
||||
#include <sys/socket.h>
|
||||
#include <netinet/in.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#if IPPROTO_TCP != 6
|
||||
/* net_server */
|
||||
|
||||
#else
|
||||
|
||||
# define closesocket close
|
||||
|
||||
# ifdef BONE_VERSION
|
||||
/* BONE */
|
||||
|
||||
# else
|
||||
/* Haiku ? */
|
||||
|
||||
# endif
|
||||
|
||||
#endif
|
||||
|
||||
#endif /* _COMPAT_H */
|
||||
@@ -0,0 +1,34 @@
|
||||
|
||||
#include <stdio.h>
|
||||
|
||||
#ifndef NDEBUG
|
||||
|
||||
#ifndef DEBUG
|
||||
#define DEBUG 2
|
||||
#endif
|
||||
|
||||
#if DEBUG >= 1
|
||||
#define UNIMPLEMENTED() printf("UNIMPLEMENTED %s\n",__PRETTY_FUNCTION__)
|
||||
#else
|
||||
#define UNIMPLEMENTED() ((void)0)
|
||||
#endif
|
||||
|
||||
#if DEBUG >= 2
|
||||
#define BROKEN() printf("BROKEN %s\n",__PRETTY_FUNCTION__)
|
||||
#else
|
||||
#define BROKEN() ((void)0)
|
||||
#endif
|
||||
|
||||
#if DEBUG >= 3
|
||||
#define CALLED() printf("CALLED %s\n",__PRETTY_FUNCTION__)
|
||||
#else
|
||||
#define CALLED() ((void)0)
|
||||
#endif
|
||||
|
||||
#else
|
||||
|
||||
#define UNIMPLEMENTED() ((void)0)
|
||||
#define BROKEN() ((void)0)
|
||||
#define CALLED() ((void)0)
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,131 @@
|
||||
/*
|
||||
* ESounD media addon for BeOS
|
||||
*
|
||||
* Copyright (c) 2006 François Revol (revol@free.fr)
|
||||
*
|
||||
* Based on Multi Audio addon for Haiku,
|
||||
* Copyright (c) 2002, 2003 Jerome Duval (jerome.duval@free.fr)
|
||||
*
|
||||
* All rights reserved.
|
||||
* Redistribution and use in source and binary forms, with or without modification,
|
||||
* are permitted provided that the following conditions are met:
|
||||
*
|
||||
* - Redistributions of source code must retain the above copyright notice,
|
||||
* this list of conditions and the following disclaimer.
|
||||
* - Redistributions in binary form must reproduce the above copyright notice,
|
||||
* this list of conditions and the following disclaimer in the documentation
|
||||
* and/or other materials provided with the distribution.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
|
||||
* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
|
||||
* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
|
||||
* EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
*/
|
||||
#ifndef _ESDPROTO_H
|
||||
#define _ESDPROTO_H
|
||||
/*
|
||||
* ESounD protocol
|
||||
* cf. http://www.jcraft.com/jesd/EsounD-protocol.txt
|
||||
*/
|
||||
|
||||
#include <inttypes.h>
|
||||
|
||||
/* limits */
|
||||
#define ESD_MAX_BUF (4 * 1024)
|
||||
#define ESD_MAX_KEY 16
|
||||
#define ESD_MAX_NAME 128
|
||||
|
||||
typedef uint32_t esd_rate_t;
|
||||
typedef uint32_t esd_format_t;
|
||||
typedef uint32_t esd_command_t;
|
||||
typedef char esd_key_t[ESD_MAX_KEY];
|
||||
typedef char esd_name_t[ESD_MAX_NAME];
|
||||
|
||||
/* defaults */
|
||||
//#define ESD_PORT 5001
|
||||
#define ESD_PORT 16001
|
||||
|
||||
#define ESD_DEFAULT_RATE 44100
|
||||
//#define ESD_DEFAULT_RATE 22050
|
||||
|
||||
#define ESD_ENDIAN_TAG 'ENDN'
|
||||
|
||||
enum {
|
||||
/* init */
|
||||
ESD_CMD_CONNECT = 0,
|
||||
|
||||
/* security */
|
||||
ESD_CMD_LOCK,
|
||||
ESD_CMD_UNLOCK,
|
||||
|
||||
ESD_CMD_STREAM_PLAY,
|
||||
ESD_CMD_STREAM_REC,
|
||||
ESD_CMD_STREAM_MON,
|
||||
|
||||
ESD_CMD_SAMPLE_CACHE,
|
||||
ESD_CMD_SAMPLE_FREE,
|
||||
ESD_CMD_SAMPLE_PLAY,
|
||||
ESD_CMD_SAMPLE_LOOP,
|
||||
ESD_CMD_SAMPLE_STOP,
|
||||
ESD_CMD_SAMPLE_KILL,
|
||||
|
||||
ESD_CMD_STANDBY,
|
||||
ESD_CMD_RESUME,
|
||||
|
||||
ESD_CMD_SAMPLE_GETID,
|
||||
ESD_CMD_STREAM_FILTER,
|
||||
|
||||
ESD_CMD_SERVER_INFO,
|
||||
ESD_CMD_SERVER_ALL_INFO,
|
||||
_ESD_CMD_SUBSCRIBE,
|
||||
_ESD_CMD_UNSUBSCRIBE,
|
||||
|
||||
ESD_CMD_STREAM_PAN,
|
||||
ESD_CMD_SAMPLE_PAN,
|
||||
|
||||
ESD_CMD_STANDBY_MODE,
|
||||
ESD_CMD_LATENCY
|
||||
};
|
||||
|
||||
#define ESD_MASK_BITS 0x000F
|
||||
#define ESD_MASK_CHAN 0x00F0
|
||||
#define ESD_MASK_MODE 0x0F00
|
||||
#define ESD_MASK_FUNC 0xF000
|
||||
|
||||
/* sample size */
|
||||
#define ESD_BITS8 0x0000
|
||||
#define ESD_BITS16 0x0001
|
||||
|
||||
/* channel count */
|
||||
#define ESD_MONO 0x0010
|
||||
#define ESD_STEREO 0x0020
|
||||
|
||||
/* mode */
|
||||
#define ESD_STREAM 0x0000
|
||||
#define ESD_SAMPLE 0x0100
|
||||
#define ESD_ADPCM 0x0200
|
||||
|
||||
/* functions */
|
||||
#define ESD_FUNC_PLAY 0x1000
|
||||
#define ESD_FUNC_MONITOR 0x0000
|
||||
#define ESD_FUNC_RECORD 0x2000
|
||||
#define ESD_FUNC_STOP 0x0000
|
||||
#define ESD_FUNC_LOOP 0x2000
|
||||
|
||||
/* errors */
|
||||
#define ESD_OK 0
|
||||
#define ESD_ERROR_STANDBY 1
|
||||
#define ESD_ERROR_AUTOSTANDBY 2
|
||||
#define ESD_ERROR_RUNNING 3
|
||||
|
||||
#define ESD_FALSE 0
|
||||
#define ESD_TRUE 1
|
||||
|
||||
#endif /* _ESDPROTO_H */
|
||||
@@ -0,0 +1,128 @@
|
||||
## BeOS Generic Makefile v2.2 ##
|
||||
|
||||
## Fill in this file to specify the project being created, and the referenced
|
||||
## makefile-engine will do all of the hard work for you. This handles both
|
||||
## Intel and PowerPC builds of the BeOS.
|
||||
|
||||
# check for net_server vs BONE
|
||||
ifeq ($(findstring headers/be/bone,$(BEINCLUDES)),)
|
||||
NETLIBS=net
|
||||
else
|
||||
NETLIBS=socket bind
|
||||
endif
|
||||
|
||||
## Application Specific Settings ---------------------------------------------
|
||||
|
||||
# specify the name of the binary
|
||||
NAME= ESDSink.media_addon
|
||||
|
||||
# specify the type of binary
|
||||
# APP: Application
|
||||
# SHARED: Shared library or add-on
|
||||
# STATIC: Static library archive
|
||||
# DRIVER: Kernel Driver
|
||||
TYPE= SHARED
|
||||
|
||||
# add support for new Pe and Eddie features
|
||||
# to fill in generic makefile
|
||||
|
||||
#%{
|
||||
# @src->@
|
||||
|
||||
# specify the source files to use
|
||||
# full paths or paths relative to the makefile can be included
|
||||
# all files, regardless of directory, will have their object
|
||||
# files created in the common object directory.
|
||||
# Note that this means this makefile will not work correctly
|
||||
# if two source files with the same name (source.c or source.cpp)
|
||||
# are included from different directories. Also note that spaces
|
||||
# in folder names do not work well with this makefile.
|
||||
SRCS= $(wildcard *.cpp)
|
||||
|
||||
# specify the resource files to use
|
||||
# full path or a relative path to the resource file can be used.
|
||||
RSRCS=
|
||||
|
||||
# @<-src@
|
||||
#%}
|
||||
|
||||
# end support for Pe and Eddie
|
||||
|
||||
# specify additional libraries to link against
|
||||
# there are two acceptable forms of library specifications
|
||||
# - if your library follows the naming pattern of:
|
||||
# libXXX.so or libXXX.a you can simply specify XXX
|
||||
# library: libbe.so entry: be
|
||||
#
|
||||
# - if your library does not follow the standard library
|
||||
# naming scheme you need to specify the path to the library
|
||||
# and it's name
|
||||
# library: my_lib.a entry: my_lib.a or path/my_lib.a
|
||||
LIBS= be media $(NETLIBS)
|
||||
|
||||
|
||||
# specify additional paths to directories following the standard
|
||||
# libXXX.so or libXXX.a naming scheme. You can specify full paths
|
||||
# or paths relative to the makefile. The paths included may not
|
||||
# be recursive, so include all of the paths where libraries can
|
||||
# be found. Directories where source files are found are
|
||||
# automatically included.
|
||||
LIBPATHS=
|
||||
|
||||
# additional paths to look for system headers
|
||||
# thes use the form: #include <header>
|
||||
# source file directories are NOT auto-included here
|
||||
SYSTEM_INCLUDE_PATHS =
|
||||
|
||||
# additional paths to look for local headers
|
||||
# thes use the form: #include "header"
|
||||
# source file directories are automatically included
|
||||
LOCAL_INCLUDE_PATHS =
|
||||
|
||||
# specify the level of optimization that you desire
|
||||
# NONE, SOME, FULL
|
||||
OPTIMIZE=
|
||||
|
||||
# specify any preprocessor symbols to be defined. The symbols will not
|
||||
# have their values set automatically; you must supply the value (if any)
|
||||
# to use. For example, setting DEFINES to "DEBUG=1" will cause the
|
||||
# compiler option "-DDEBUG=1" to be used. Setting DEFINES to "DEBUG"
|
||||
# would pass "-DDEBUG" on the compiler's command line.
|
||||
DEFINES=
|
||||
|
||||
# specify special warning levels
|
||||
# if unspecified default warnings will be used
|
||||
# NONE = supress all warnings
|
||||
# ALL = enable all warnings
|
||||
WARNINGS =
|
||||
|
||||
# specify whether image symbols will be created
|
||||
# so that stack crawls in the debugger are meaningful
|
||||
# if TRUE symbols will be created
|
||||
SYMBOLS =
|
||||
|
||||
# specify debug settings
|
||||
# if TRUE will allow application to be run from a source-level
|
||||
# debugger. Note that this will disable all optimzation.
|
||||
DEBUGGER =
|
||||
|
||||
# specify additional compiler flags for all files
|
||||
COMPILER_FLAGS =
|
||||
|
||||
# specify additional linker flags
|
||||
LINKER_FLAGS =
|
||||
|
||||
# specify the version of this particular item
|
||||
# (for example, -app 3 4 0 d 0 -short 340 -long "340 "`echo -n -e '\302\251'`"1999 GNU GPL")
|
||||
# This may also be specified in a resource.
|
||||
APP_VERSION =
|
||||
|
||||
# (for TYPE == DRIVER only) Specify desired location of driver in the /dev
|
||||
# hierarchy. Used by the driverinstall rule. E.g., DRIVER_PATH = video/usb will
|
||||
# instruct the driverinstall rule to place a symlink to your driver's binary in
|
||||
# ~/add-ons/kernel/drivers/dev/video/usb, so that your driver will appear at
|
||||
# /dev/video/usb when loaded. Default is "misc".
|
||||
DRIVER_PATH =
|
||||
|
||||
## include the makefile-engine
|
||||
include $(BUILDHOME)/etc/makefile-engine
|
||||
Reference in New Issue
Block a user