SDL ios音频简单测试例子-借鉴雷大神的代码

news/2024/7/20 20:19:19 标签: sdl, ios

本实例主要代码如下:

AudioPlayerSDL2.mm

//
//  AudioSDLTest.m
//  AudioTest
//
//  Created by zhufu on 2018/1/20.
//  Copyright © 2018年 zhufu. All rights reserved.
//
#import "AudioPlayerSDL2.h"
//Buffer:
//|-----------|-------------|
//chunk-------pos---len-----|
static  Uint32  audio_len;
static  Uint8  *audio_pos;

/* Audio Callback
 * The audio function callback takes the following parameters:
 * stream: A pointer to the audio buffer to be filled
 * len: The length (in bytes) of the audio buffer
 *
 */
void  fill_audio(void *udata,Uint8 *stream,int len){
    //SDL 2.0
    SDL_memset(stream, 0, len);
    if(audio_len==0)        /*  Only  play  if  we  have  data  left  */
        return;
    
    len=(len>audio_len?audio_len:len);    /*  Mix  as  much  data  as  possible  */
    printf("audio   %d %d\n", audio_len, len);
    SDL_MixAudio(stream,audio_pos,len,SDL_MIX_MAXVOLUME);
    audio_pos += len;
    
    audio_len -= len;
}

int cppTest()
{
    SDL_SetMainReady();
    //Init
    if(SDL_Init(SDL_INIT_AUDIO | SDL_INIT_TIMER)) {
        printf( "Could not initialize SDL - %s\n", SDL_GetError());
        return -1;
    }
    //SDL_AudioSpec
    SDL_AudioSpec wanted_spec;
    wanted_spec.freq = 44100;
    wanted_spec.format = AUDIO_S16SYS;
    wanted_spec.channels = 2;
    wanted_spec.silence = 0;
    wanted_spec.samples = 1024;
    wanted_spec.callback = fill_audio;
    
    if (SDL_OpenAudio(&wanted_spec, NULL)<0){
        printf("can't open audio.\n");
        return -1;
    }
    
    NSString *ppth = [[NSBundle mainBundle] pathForResource:@"testv" ofType:@"pcm"];
    FILE *fp=fopen([ppth UTF8String],"r");
    if(fp==NULL){
        printf("cannot open this file\n");
        return -1;
    }
    //For YUV420P
    int pcm_buffer_size=4096;
    char *pcm_buffer=(char *)malloc(pcm_buffer_size);
    int data_count=0;
    
    while(1){
        if (fread(pcm_buffer, 1, pcm_buffer_size, fp) != pcm_buffer_size){
            // Loop
            fseek(fp, 0, SEEK_SET);
            fread(pcm_buffer, 1, pcm_buffer_size, fp);
            data_count=0;
        }
        printf("Now Playing %10d Bytes data.\n",data_count);
        data_count+=pcm_buffer_size;
        //Set audio buffer (PCM data)
        //Audio buffer length
        audio_len =pcm_buffer_size;
        audio_pos = (Uint8 *) pcm_buffer;
        //Play
        
        SDL_PauseAudio(0);
        while(audio_len>0){ //Wait until finish
            SDL_Delay(1);
        }
    }
    
    return 0;
}

AudioPlayerSDL2.h

//
//  AudioPlayerSDL2.h
//  AudioTest
//
//  Created by zhufu on 2018/1/20.
//  Copyright © 2018年 zhufu. All rights reserved.
//

#ifndef AudioPlayerSDL2_h
#define AudioPlayerSDL2_h

#include <stdio.h>
#include "include/SDL.h"
#include "AudioSDLTest.h"
void  fill_audio(void *udata,Uint8 *stream,int len);
int cppTest(void);

#endif /* AudioPlayerSDL2_h */

源代码https://github.com/zhu12345618/iOSAudioTest


http://www.niftyadmin.cn/n/1301428.html

相关文章

Linux命令备忘录

下载ps.txt文件 sz ps.txt上传&#xff08;-y是确定覆盖&#xff0c;没有同名文件可不写&#xff09; rz -y端口占用 netstat -naolp | grep "8080"查找 find / -name memcache回到上一次目录 cd -当前文件夹下&#xff0c;文件大小 du -sh *关机 shutdown -h…

交叉编译sdl2成android的.so库

去官网下载sdl2的源码&#xff0c;把源码解压&#xff0c;我下载的是2.0.7&#xff0c;解压会生成SDL2-2.0.7。 如果大家还有不了解的可以去我的之前的博文http://blog.csdn.net/u013654125/article/details/79157944的一、二小节了解。博文里有SDL2-2.0.7的下载地址。 解压出…

vscode配置go的tools(20210526有效)

1.首先开启go 依赖管理模块支持 go env -w GO111MODULEon2.配置goproxy代理: 七牛云配置&#xff1a; go env -w GOPROXYhttps://goproxy.cn3.配置或关闭GOSUMDB校验&#xff1a; Go 1.16设置了默认的GOSUMDBsum.golang.org&#xff0c;是用来验证包的有效性。这个网址由于…

localStorage sessionStorage cookie的区别

文章转载自&#xff1a;http://blog.csdn.net/cwzhsi/article/details/49557879 一、基本概念 Cookie cookie比较小&#xff0c;大小限制在4kb左右&#xff0c;是网景公司的前雇员 LouMontulli 在1993年3月的发明。它的主要用途有保存登录信息&#xff0c;比如你登录某个网站市…

MySQL函数关键字(一)条件控制 if/case when

MySQL 官方手册 8.0 Reference Manual - Flow Control Functions 1、if IF(expr1,expr2,expr3)流程控制&#xff0c;可以理解为case when then else end的语法糖&#xff0c;或者理解为三目运算符 例如&#xff1a; # 1 可以放在select中&#xff0c;字段转换输出 select em…

MySQL函数关键字(二)分组 group by/group_concat()

MySQL 官方手册 8.0 Reference Manual - GROUP BY Modifiers MySQL 官方手册 8.0 Reference Manual - GROUP_CONCAT(expr) 1、group by ​ 通过select在返回集字段中&#xff0c;这些字段要么就要包含在group by语句后面 作为分组的依据&#xff0c;要么就要被包含在聚合函数中…

xcode编译配置

之前做cocos2dx的时候一直不明白SRCROOT和PROJECT_DIR是什么具体含义&#xff0c;以为是2dx构建的&#xff0c;最近才查了一些资料。 1.$(SRCROOT)宏和$(PROJECT_DIR)宏&#xff1a; 都指xxx.xcodeproj所在的父目录。 2.search paths里有引号和没有引号的区别&#xff1a; 双…

cocos2dx和CocosCreator的android端引入第三方库的配置

在我们使用cocos2dx-js、cocos2dx-lua或者CocosCreator原生&#xff0c;且还需要使用第三方库的时候&#xff0c;第三方库的配置问题还是有一点麻烦的&#xff0c;如果没有配置过的话&#xff0c;确实会走许多弯路。在这里&#xff0c;我简略说一下。 这篇文章只说清楚android…