网站首页 >> 创业项目 >> 正文 提交收录

tinyplay源码分析(tinyplayer模块)

时间:2022年06月08日 12:06:18

本文目录一览:

如何用code:blocks编写tiny词法分析器

Tiny语言和c-相比更为简单,在实现的时候,对文本的读取,发现回车换行是一个头疼的问题,fgetc()函数和fseek()函数并不是一一对应的。fseek()会回车换行算两个字符,而fgetc()读到’\r’或’\n’其中一个都会返回’\n’,也就是说把回车换行符当作一个字符。

代码如下:

#include iostream

#include stdio.h

#include stdlib.h

#include string.h

#define sfName "source.tiny"

#define tfName "target.tiny"

using namespace std;

FILE *source;

FILE *target;

int sequence=0; //目标文件序号

int s[5]={0}; //保存token类型的状态

char str[200]=""; //保存需要返回的字符串

char op[10]={'+','-','*','/',':','=','',';','(',')'};

char line[200]="" //保存一行字符

char *resw[]={"if","then","else","end","repeat","until","read","write"};

char *token[]={"ID","NUM","RESW","OP","ERROR","COM"};

typedef enum{ID=0,NUM,RESW,OP,ERROR,COM}TokenType;

void clearState()

{

memset(s,0,sizeof(s));

memset(str,'\0',sizeof(str));

}

void printStr(TokenType t)

{

if(t==5)

{

fprintf(target,"%d:%s\n",sequence,str);

}else

fprintf(target,"%d:%s,%s\n",sequence,token[t],str);

sequence++;

}

void comment(char ch,int i)

{

bool isExit = false;

int count =0;

while(!feof(source))

{

switch( s[i] )

{

case 0:

if(ch=='{')

{

s[i]=1;

str[count]=ch;

count++;

}

break;

case 1:

if(ch=='}')

{

s[i]=2;

isExit = true;

str[count]=ch;

printStr(COM);

}else

{

s[i]=1;

str[count]=ch;

count++;

}

break;

default:cout"data error\n";

}

if(isExit) return;

ch = fgetc(source);

}

}

void digit(char ch,int i)

{

int cout=0;

bool isExit = false;

while(!feof(source))

{

if(ch='0' ch='9')

{

s[i]=1;

str[cout]=ch;

cout++;

}else

{

s[i]=0;

fseek(source,-1L,1);

printStr(NUM);

isExit = true;

}

if(isExit) return;

ch = fgetc(source);

}

}

bool isOperator(char ch)

{

for(int i=0;i10;i++)

{

if(ch==op[i])

return true;

}

return false;

}

void myOperator(char ch,int i)

{

int count = 0;

while(!feof(source))

{

if(ch=='+' || ch =='-'||ch=='*'||ch=='/'||ch==''||ch=='('||ch==')'||ch==';')

{

str[count]=ch;

printStr(OP);

return;

}else if(ch==':' || ch=='=')

{

switch(s[i])

{

case 0:

if(ch==':')

{

s[i]=1;

str[count]=ch;

count++;

}else

{

s[i]=0;

str[count]=ch;

printStr(OP);

return;

}

break;

case 1:

if(ch=='=')

{

s[i]=2;

str[count]=ch;

printStr(OP);

return;

}

break;

default:cout"data error\n";

}

}else

{

str[count]=ch;

printStr(ERROR);

return;

}

ch = fgetc(source);

}

}

bool isResw()

{

for(int i=0;i8;i++)

{

if(strcmp(str,resw[i])==0)

return true;

}

return false;

}

void identifier(char ch,int i)

{

int cout=0;

while(!feof(source))

{

if((ch='A'ch='Z')||(ch='a'ch='z'))

{

s[i]=1;

str[cout]=ch;

cout++;

}else

{

s[i]=0;

fseek(source,-1L,1); //回退一个字符

if( isResw())

printStr(RESW);

else

printStr(ID);

return;

}

ch = fgetc(source);

}

if(ch == EOF)

{

if( isResw())

printStr(RESW);

else

printStr(ID);

return;

}

}

void scanner()

{

char ch,s;

ch = fgetc(source);

while(!feof(source))

{

for(int i=0;ch!='\n' || ch!=EOF;i++)

{

line[i]=ch;

ch = fgetc(source);

}

for(int j=0;line[j]!='\0';j++)

{

}

if(ch=='\n' ||ch==' '||ch=='\t')

{

;//跳过

}else if(ch=='{')

{

comment(ch,0);

}else if(ch='0' ch='9')

{

digit(ch,1);

}else if( isOperator(ch) )

{

myOperator(ch,2);

}else if((ch='A'ch='Z')||(ch='a'ch='z'))

{

identifier(ch,3);

}else

{

str[0] = ch;

printStr(ERROR);

}

clearState();//清除状态

ch = fgetc(source);

}

}

int main()

{

FILE *fp;

char s;

if((fp=fopen(sfName,"r"))==NULL)

{

printf("file open error!\n");

exit(0);

}else

{

s = fgetc(fp);

while(!feof(fp))

{

printf("%c",s); // diaplay source.tiny

s=fgetc(fp);

}

printf("\n\n");

}

fclose(fp);

if((source=fopen(sfName,"r"))==NULL)

{

printf("文件打开错误!\n");

exit(0);

}

if((target=fopen(tfName,"w"))==NULL)

{

printf("文件打开错误!\n");

exit(0);

}

scanner(); //********************entrance******************************//

fclose(source);

fclose(target);

cout"词法分析如下"endl;

if((fp=fopen(tfName,"r"))==NULL)

{

printf("文件打开错误!\n");

exit(0);

}else

{

s = fgetc(fp);

while(!feof(fp))

{

printf("%c",s); // diaplay target.tiny

s=fgetc(fp);

}

printf("\n\n");

}

fclose(fp);

return 0;

}

Android tinyAlsa 是什么?怎么调用?

1.

编译tinyalsa配套工具

2.

$

mmm

external/tinyalsa/

3.

编译完后会产生tinyplay/tinymix/tinycap等等工具。

4.

tinymix:

查看配置

混音器

5.

tinyplay:

播放音频

6.

tinycap:

录音

7.

8.

2.查看当前系统的声卡

[python]

view

plain

copy

root@android:/

#

cat

/proc/asound/cards

[RKRK616

]:

RK_RK616

-

RK_RK616

RK_RK616

1

[ROCKCHIPSPDIF

]:

ROCKCHIP-SPDIF

-

ROCKCHIP-SPDIF

ROCKCHIP-SPDIF

root@android:/

#

3.tinymix查看混响器

tinymix使用 *** a.不加任何参数-显示当前配置情况

b.tinymix

[ctrl

id]

[var]不加[var]可以查看该[ctrl

id]可选选项。

[python]

view

plain

copy

root@android:/

#

tinymix

Number

of

controls:

7

ctl

type

num

name

value

ENUM

1

Playback

Path

OFF

1

ENUM

1

Capture

MIC

Path

MIC

OFF

2

ENUM

1

Voice

Call

Path

OFF

3

ENUM

1

Voip

Path

OFF

4

INT

2

Speaker

Playback

Volume

5

INT

2

Headphone

Playback

Volume

6

ENUM

1

Modem

Input

Enable

ON

root@android:/

#

4.使用tinyplay播放wav音乐

这个只是一个最基本的播放器,所以不支持播放MP3等等压缩过格式的音乐。没有学会使用前,网上都说很麻烦,但是现在看来一点也不麻烦,直接播放了44.1kHz/44.8kHz的wav音乐。

[python]

view

plain

copy

root@android:/

#

tinyplay

/sdcard/0_16.wav

Playing

sample:

2

ch,

44100

hz,

16

bit

root@android:/

#

注:播放之前得首先使用tinymix把通道设置好,上文中已经给出了设置到扬声器中的例子;由于播放时使用的更大音量进行播放的,所以注意防止被吓到。这里将测试音频文件上传。

5.tinycap使用

root@android:/

#

tinycap

/sdcard/test.wav

可以进行录音。

目前只遇到这些,就先总结到这,可以随时再深入。

android 应用怎样调用tinyalsa

1.编译tinyalsa配套工具

$ mmm external/tinyalsa/

编译完后会产生tinyplay/tinymix/tinycap等等工具。

tinymix: 查看配置混音器

tinyplay: 播放音频

tinycap: 录音

2.查看当前系统的声卡

[python] view plain copy

root@android:/ # cat /proc/asound/cards

0 [RKRK616 ]: RK_RK616 - RK_RK616

RK_RK616

1 [ROCKCHIPSPDIF ]: ROCKCHIP-SPDIF - ROCKCHIP-SPDIF

ROCKCHIP-SPDIF

root@android:/ #

3.tinymix查看混响器

tinymix使用 *** a.不加任何参数-显示当前配置情况 b.tinymix [ctrl id] [var]不加[var]可以查看该[ctrl id]可选选项。

[python] view plain copy

root@android:/ # tinymix

Number of controls: 7

ctl type num name value

0 ENUM 1 Playback Path OFF

1 ENUM 1 Capture MIC Path MIC OFF

2 ENUM 1 Voice Call Path OFF

3 ENUM 1 Voip Path OFF

4 INT 2 Speaker Playback Volume 0 0

5 INT 2 Headphone Playback Volume 0 0

6 ENUM 1 Modem Input Enable ON

root@android:/ #

4.使用tinyplay播放wav音乐

这个只是一个最基本的播放器,所以不支持播放MP3等等压缩过格式的音乐。没有学会使用前,网上都说很麻烦,但是现在看来一点也不麻烦,直接播放了44.1kHz/44.8kHz的wav音乐。

[python] view plain copy

root@android:/ # tinyplay /sdcard/0_16.wav

Playing sample: 2 ch, 44100 hz, 16 bit

root@android:/ #

注:播放之前得首先使用tinymix把通道设置好,上文中已经给出了设置到扬声器中的例子;由于播放时使用的更大音量进行播放的,所以注意防止被吓到。这里将测试音频文件上传。

5.tinycap使用

root@android:/ # tinycap /sdcard/test.wav

可以进行录音。

目前只遇到这些,就先总结到这,可以随时再深入。