64,654
社区成员
发帖
与我相关
我的任务
分享
#include <stdio.h>
#include <stdint.h>
#ifndef interface
#define interface struct
#endif
#define extends public
#define implements virtual public
#define instanceof(T, ptr) dynamic_cast<T *>(ptr)
interface ILine
{
virtual void open() = 0;
virtual void close() = 0;
};
interface IDataLine : implements ILine
{
virtual void drain() = 0;
virtual void flush() = 0;
virtual void start() = 0;
virtual void stop() = 0;
virtual long available() = 0;
};
interface ISourceDataLine : implements IDataLine
{
virtual void open(void *param, long size) = 0;
virtual void open(void *param) = 0;
virtual long write(void *buf, long size) = 0;
};
class AbstractLine : implements ILine
{
public:
AbstractLine() { printf("AbstractLine::AbstractLine()\n"); }
virtual ~AbstractLine() { printf("AbstractLine::~AbstractLine()\n"); }
virtual void open() { printf("AbstractLine::open()\n"); }
virtual void close() { printf("AbstractLine::close()\n"); }
private:
AbstractLine(const AbstractLine& line);
AbstractLine& operator=(const AbstractLine& line);
};
class AbstractDataLine : extends AbstractLine, implements IDataLine
{
public:
AbstractDataLine() { printf("AbstractDataLine::AbstractDataLine()\n"); }
~AbstractDataLine() { printf("AbstractDataLine::~AbstractDataLine()\n"); }
virtual void drain() { printf("AbstractDataLine::drain()\n"); }
virtual void flush() { printf("AbstractDataLine::flush()\n"); }
virtual void start() { printf("AbstractDataLine::start()\n"); }
virtual void stop() { printf("AbstractDataLine::stop()\n"); }
virtual long available() { printf("AbstractDataLine::available()\n"); return 0; }
private:
AbstractDataLine(const AbstractDataLine& line);
AbstractDataLine& operator=(const AbstractDataLine& line);
};
class DirectSDL : extends AbstractDataLine, implements ISourceDataLine
{
public:
DirectSDL() { printf("DirectSDL::DirectSDL()\n"); }
~DirectSDL() { printf("DirectSDL::~DirectSDL()\n"); }
virtual void open(void *param, long size) { printf("DirectSDL::open(void *param, long size)\n"); }
virtual void open(void *param) { printf("DirectSDL::open(void *param)\n"); }
virtual long write(void *buf, long size) { printf("DirectSDL::write(void *buf, long size)\n"); return 0; }
private:
DirectSDL(const DirectSDL& line);
DirectSDL& operator=(const DirectSDL& line);
};
int main(int argc, char *argv[])
{
DirectSDL *pSDL = new DirectSDL;
ISourceDataLine *pSourceDataLine = pSDL;
IDataLine *pDataLine = pSDL;
ILine *pLine = pSDL;
printf("\n");
pSourceDataLine->open();
pSourceDataLine->start();
pSourceDataLine->write(NULL, 0);
pSourceDataLine->stop();
pSourceDataLine->close();
printf("\n");
delete pSDL;
return 0;
}
#include <stdio.h>
#include <stdint.h>
#ifndef interface
#define interface struct
#endif
#define extends public
#define implements virtual public
#define instanceof(T, ptr) dynamic_cast<T *>(ptr)
typedef struct AudioFormat
{
float sample_rate;
int channels;
int sample_bit;
} AudioFormat;
interface ILine
{
virtual void open() = 0;
virtual void open(const AudioFormat &format, long size) = 0;
virtual void open(const AudioFormat &format) = 0;
virtual void close() = 0;
};
interface IDataLine : implements ILine
{
virtual void drain() = 0;
virtual void flush() = 0;
virtual void start() = 0;
virtual void stop() = 0;
virtual long available() = 0;
};
interface ISourceDataLine : implements IDataLine
{
virtual long write(void *buf, long size) = 0;
};
interface ITargetDataLine : implements IDataLine
{
virtual long read(void *buf) = 0;
};
class AbstractLine : implements ILine
{
public:
AbstractLine() { printf("AbstractLine::AbstractLine()\n"); }
virtual ~AbstractLine() { printf("AbstractLine::~AbstractLine()\n"); }
virtual void open() { printf("AbstractLine::open()\n"); }
virtual void open(void *param, long size) { printf("AbstractLine::open(void *param, long size)\n"); }
virtual void open(void *param) { printf("AbstractLine::open(void *param)\n"); }
virtual void close() { printf("AbstractLine::close()\n"); }
private:
AbstractLine(const AbstractLine& line);
AbstractLine& operator=(const AbstractLine& line);
};
class AbstractDataLine : extends AbstractLine, implements IDataLine
{
public:
AbstractDataLine() { printf("AbstractDataLine::AbstractDataLine()\n"); }
~AbstractDataLine() { printf("AbstractDataLine::~AbstractDataLine()\n"); }
virtual void drain() { printf("AbstractDataLine::drain()\n"); }
virtual void flush() { printf("AbstractDataLine::flush()\n"); }
virtual void start() { printf("AbstractDataLine::start()\n"); }
virtual void stop() { printf("AbstractDataLine::stop()\n"); }
virtual long available() { printf("AbstractDataLine::available()\n"); return 0; }
private:
AbstractDataLine(const AbstractDataLine& line);
AbstractDataLine& operator=(const AbstractDataLine& line);
};
class DirectSDL : extends AbstractDataLine, implements ISourceDataLine
{
public:
DirectSDL() { printf("DirectSDL::DirectSDL()\n"); }
~DirectSDL() { printf("DirectSDL::~DirectSDL()\n"); }
virtual void open() { printf("DirectSDL::open()\n"); }
virtual void open(const AudioFormat &format, long size) { printf("DirectSDL::open(const AudioFormat &format, long size)\n"); }
virtual void open(const AudioFormat &format) { printf("DirectSDL::open(const AudioFormat &format)\n"); }
virtual long write(void *buf, long size) { printf("DirectSDL::write(void *buf, long size)\n"); return 0; }
private:
DirectSDL(const DirectSDL& line);
DirectSDL& operator=(const DirectSDL& line);
};
class DirectTDL : extends AbstractDataLine, implements ITargetDataLine
{
public:
DirectTDL() { printf("DirectTDL::DirectTDL()\n"); }
~DirectTDL() { printf("DirectTDL::~DirectTDL()\n"); }
virtual void open() { printf("DirectTDL::open()\n"); }
virtual void open(const AudioFormat &format, long size) { printf("DirectTDL::open(const AudioFormat &format, long size)\n"); }
virtual void open(const AudioFormat &format) { printf("DirectTDL::open(const AudioFormat &format)\n"); }
virtual long read(void *buf) { printf("DirectTDL::read(void *buf)\n"); return 0; }
private:
DirectTDL(const DirectTDL& line);
DirectTDL& operator=(const DirectTDL& line);
};
int main(int argc, char *argv[])
{
DirectSDL *pSDL = NULL;
DirectTDL *pTDL = NULL;
ISourceDataLine *pSourceDataLine = NULL;
ITargetDataLine *pTargetDataLine = NULL;
IDataLine *pDataLine = NULL;
ILine *pLine = NULL;
AudioFormat format = {0};
pSDL = new DirectSDL;
pSourceDataLine = pSDL;
pDataLine = pSDL;
pLine = pSDL;
printf("\n");
pSourceDataLine->open();
pSourceDataLine->open(format);
pSourceDataLine->open(format, 88200);
pSourceDataLine->start();
pSourceDataLine->write(NULL, 0);
pSourceDataLine->stop();
pSourceDataLine->close();
printf("\n");
delete pSDL;
printf("\n");
pTDL = new DirectTDL;
pTargetDataLine = pTDL;
pDataLine = pTDL;
pLine = pTDL;
printf("\n");
pTargetDataLine->open();
pTargetDataLine->open(format);
pTargetDataLine->open(format, 88200);
pTargetDataLine->start();
pTargetDataLine->read(NULL);
pTargetDataLine->stop();
pTargetDataLine->close();
printf("\n");
delete pTDL;
return 0;
}
我把ISourceDataLine里的两个open函数提升到ILine里,就可以调用了。