Другие консоли: PS3(CECHC 60Gb), DS lite, x360(20Gb/120Gb)
Регистрация: 11.05.2007
Возраст: 43
Сообщений: 2,509
Вы сказали Спасибо: 337
Поблагодарили 988 раз(а) в 579 сообщениях
Сила репутации: 1
Репутация: 948 
(это имя известно всем)
про остановить, поставить eof в 1 перемотка это управление указателем мп3 файла, подробнее сказать затрудняюсь, для не VBR вроде всё просто но надо пробовать. пауза возникнет если не устанавливать donext в 1. тут конечно надо всё переписать на семафоры, но для проги примера и так потянет. я щас озадачился сделать простой движок для проигрывания файлов мр3, мр4 и wav(pcm). вот там всё будет. работы потихоньку ведутся.
докладываю по видео.
есть рабочий пример как разобрать и проиграть pmf, от mp4 отличается как я понял только другим форматом звуковой дорожки. точно также как и тут использует только кишки psp, всё работает очень шустро. архив прилагаю, использовать аккуратно, там cpp, и прочие непонятные вещи, афтор говорит что прога иногда виснет. для генерации pmf файлоф надо качать из торентов UMD tools. эти тулсы Sony confidecial такчто ессно проги с ними потом распространять не получится, надо всётаки добивать мр4 чем и занимаюсь.
на форуме кстати не обозначена ситуация с подобными тулзами. может и упоминать нельзя было?
Другие консоли: PS3(CECHC 60Gb), DS lite, x360(20Gb/120Gb)
Регистрация: 11.05.2007
Возраст: 43
Сообщений: 2,509
Вы сказали Спасибо: 337
Поблагодарили 988 раз(а) в 579 сообщениях
Сила репутации: 1
Репутация: 948 
(это имя известно всем)
1) прошу переименовать тему в "Играем мр3, мр4(h264), wav(pcm), atrac, aac"
2) простенький пример как играть пцм вав, играется на параметрах консолькой по умолчанию(44.1 кГц частота семплирования, 16бит на семпл), однако не проблема изменить их на выбранный канал благо как извлеч инфу из файла там показано...
следущим примером (аринтеровочно завтра если не разленюсь опять) будет атрас3 и атрак3+.
Другие консоли: PS3(CECHC 60Gb), DS lite, x360(20Gb/120Gb)
Регистрация: 11.05.2007
Возраст: 43
Сообщений: 2,509
Вы сказали Спасибо: 337
Поблагодарили 988 раз(а) в 579 сообщениях
Сила репутации: 1
Репутация: 948 
(это имя известно всем)
RC альфа беты версии моей либы для играния звукофф. щас мы умеем играть до 8ми звуков одновременно, в данный момент тока вав, мр3, атрак3/+.
ограничения, тока 16bit 44.1кГц причём атрак и мр3 могут быть тока стерео, вавы=моно и стерео.
особо хочется отметить что не получается добиться одновременново качественного воспроизведения чегото отличного от вава...если же забить болтяру на пожирание ресурсов вечным циклом звуковова потока то всё становится идеально. сие есть парадокс для меня, декодирование слежующего фрейма происходит в 5-6 раз быстрее чем отыграет старый, однако видимо хитрость планировщика потоков велика и управление не возвращается достаточно долго чтобы мы пропустили пару семплов в начале и всё закашлялось. воистину тайна великая есмь. как жаль что не владею я джитсу реверс инженеринга
юзание, подключить хедер инклудом, в мейк фал добавть -ml.o
сырцы пока не выкладываю ибо уж очень стыдно за внутренний хаос :give_rose:
далее всё просто, в начале гденить лепим mlInit() а потом чтобы чтота проиграть mlPlay("ms0:/test.mp3"), можно также хитрее mlPlayEx("ms0:/test.mp3", тутагромкость, COOP), флажок кооп нужен чтобы звук с темже именем играл даже в том случае если онже уже играет. вот. пока больше нифига не работает, в часности зацикливание и кеширование файлов целиком в память. ибо очень меня качество звука занимает чтобы время тратить на остальное всё.
а да кстати остановка, пауза и резюм тоже не работают пока :p как пропускать заголовок мр3 файла я тоже пока не делал, такчто тут тоже могут некоторые не работать...вот атрак&wav зато работает почти на 100% ибо riff.
вобщем велком, жду отзывов
релиз посвящается вСлаве, да прибудет с ним сила довести ИДЕ до совершенства абсолютного!
Последний раз редактировалось l3VGV; 21.07.2007 в 00:10.
Что-то у меня последний аттач открывает attachment.php и молчит :\
А вообще очень жду релиза. Может заделаю на на этой базе крутой mp3 плагин =) А то mp3_04f юзает libmad и на некоторых mp3 с низким биптрейтом(?) напоминает пакмана с доса на 4 пентиуме: "Мойадреснедоминеулица,мойадрессоветскийсоюз" :\
Есть идея гениального интерфейса к mp3 плагину =)
Последний раз редактировалось freecod; 03.08.2007 в 04:23.
Другие консоли: PS3(CECHC 60Gb), DS lite, x360(20Gb/120Gb)
Регистрация: 11.05.2007
Возраст: 43
Сообщений: 2,509
Вы сказали Спасибо: 337
Поблагодарили 988 раз(а) в 579 сообщениях
Сила репутации: 1
Репутация: 948 
(это имя известно всем)
во очередная альфа. даже стабильная. даже играет. однако из функция работают тока плей и стоп алл :man_in_love:
в принципе для простеньково плеера хватит.
Другие консоли: PS3(CECHC 60Gb), DS lite, x360(20Gb/120Gb)
Регистрация: 11.05.2007
Возраст: 43
Сообщений: 2,509
Вы сказали Спасибо: 337
Поблагодарили 988 раз(а) в 579 сообщениях
Сила репутации: 1
Репутация: 948 
(это имя известно всем)
Времени чтобы уделять его развитию категарически нехватает. пожтому выкладываю полные исходники того что есть на данный момент.
в дальнейшем(читай когда время нарисуется) акцент будете перемещён на поддержку исключительно атрака и мр4 фиксированного фармата. ибо хочу сделать простенькую игрушку а там универсальность ненужна.
А никто не может рассказать, каким образом на PSP звук вообще запускается и как им управлять? Точнее, меня интересуют вот какие вопросы:
1) Как я понимаю, для работы со звуком создаётся канал. Один канал - один звук. То есть, если я запущу два канала одновременно, то они будут микшироваться и накладываться друг на друга?
2) Команда sceAudioChReserve(PSP_AUDIO_NEXT_CHANNEL,pspsample,PSP_AUDIO_FORMAT_MONO); принимает в параметре pspsample частоту сигнала или размер буфера мгновенного воспроизведения (т.е. того буфера, в котором происходит микширование)? Я делал int pspsample=PSP_AUDIO_SAMPLE_ALIGN(22050), а потом подавал на sceAudioSetChannelDataLen размер буфера равный pspsample. Вызывал sceAudioOutputBlocking и при воспроизведении возникают "пробелы". Выходит, что это как раз размер буфера микширования. Я правильно понимаю?
3) Если пункт 2 верный, то как можно изменить частоту дискретизации и разрядность звука? Я вот хочу 22050 и 8 бит. Я такой команды не нашёл в pspaudio.h. Или она замаскирована.
4) Какой максимальный размер звука можно подавать sceAudioSetChannelDataLen? И вообще, sceAudioOutputBlocking нужен выровненный по 64 байта блок данных или всё равно? В pspaudio.h ничего об этом не сказано, но здесь в примерах я видел, что выделялся выровненный блок.
Просто я написал игрушку и хотел к ней приделать звуковое оформление. Ан нет. Всё не так просто, как в Direct Sound.
Другие консоли: PS3(CECHC 60Gb), DS lite, x360(20Gb/120Gb)
Регистрация: 11.05.2007
Возраст: 43
Сообщений: 2,509
Вы сказали Спасибо: 337
Поблагодарили 988 раз(а) в 579 сообщениях
Сила репутации: 1
Репутация: 948 
(это имя известно всем)
я пытался понять директ саунд. тут наоборот всё прощее. только нету толковых манов.
1) 1 канал = 1 аппаратный канал в звукочипе. каналы могут иметь разные настройки и аппаратно качественно смешаются на выходе. никто не запрещает сделать 10 софтовых каналов миксовать самому и выдавать в 1 аппаратный. что и сделано в сдл либ и многих других.
2) передается туда частота дискретизации. 44.1К, 20.05К и тп.
3) сделать 8бит невозможно, железка знает тока про 16. те точность не регулируется. на вход всегда подается минимум 4*16. частоту менять можно от 8 до 48.
4) для скорости рекомендую давать кусками по 2-4 килобайта и выше. чем больше кусок тем меньше вероятность кряка. максимум вроде 32. не помню точно. блок выдавать ровный и не из кэша. ато иначе он будет неуправляемый.
2) передается туда частота дискретизации. 44.1К, 20.05К и тп.
Тогда я не понимаю, почему вот такая вот программа воспроизводит на нормальной скорости test.wav с параметрами 44100x16, даже если я укажу int pspsample=PSP_AUDIO_SAMPLE_ALIGN(11050);
#include <pspkernel.h>
#include <pspdebug.h>
#include <pspctrl.h>
#include <pspaudiolib.h>
#include <pspaudio.h>
#include <math.h>
#include <malloc.h>
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
//----------------------------------------------------------------------------------------
PSP_MODULE_INFO("Sound", 0, 1, 1);
PSP_MAIN_THREAD_ATTR(THREAD_ATTR_USER|THREAD_ATTR_VFPU);
void dump_threadstatus(void);
bool done=false;
int exit_callback(int arg1,int arg2,void *common)
{
done=true;
return(0);
}
void audio_callback(void* buf,unsigned int length,void *userdata)
{
/*
sample_t* ubuf=(sample_t*)buf;
for(unsigned int n=0;n<length;n++)
{
ubuf[n].r=255*(n%2);
ubuf[n].l=255*((int)(n/2));
}
*/
}
int CallbackThread(SceSize args, void *argp)
{
int cbid;
cbid=sceKernelCreateCallback("Exit Callback",exit_callback,NULL);
sceKernelRegisterExitCallback(cbid);
sceKernelSleepThreadCB();
return(0);
}
int SetupCallbacks(void)
{
int thid = 0;
thid=sceKernelCreateThread("update_thread",CallbackThread,0x11,0xFA0,0,0);
if(thid>=0) sceKernelStartThread(thid, 0, 0);
return(thid);
}
//----------------------------------------------------------------------------------------
//начинаем программу
int main(int argc, char **argv)
{
int n;
int argv_len=strlen(argv[0]);
//формируем имя файла уровня
//отматываем до черты
for(n=argv_len;n>0;n--)
{
if (argv[0][n-1]=='/')
{
argv[0][n]=0;//обрубаем строку
break;
}
}
//устанавливаем обработчики
SetupCallbacks();
pspAudioInit();
sceCtrlSetSamplingCycle(0);
sceCtrlSetSamplingMode(PSP_CTRL_MODE_ANALOG);
SceCtrlData pad;
//получаем канал и устанавливаем его параметры
int pspsample=PSP_AUDIO_SAMPLE_ALIGN(11050);
int channel=sceAudioChReserve(PSP_AUDIO_NEXT_CHANNEL,pspsample,PSP_AUDIO_FORMAT_MONO);
if (channel>0)
{
unsigned char *Sound=(unsigned char*)memalign(64,1024*1024*2);
char string[255];
unsigned char *ptr=Sound;
sprintf(string,"%stest.wav",argv[0]);
FILE *file=fopen(string,"rb");
int length=0;
while(1)
{
unsigned char b;
if (fread(&b,1,1,file)<=0) break;
*ptr=b;
ptr++;
length++;
}
fclose(file);
int offset=44;
unsigned char *SampleBuffer=(unsigned char*)malloc(16384);
while(done==false)
{
sceCtrlReadBufferPositive(&pad,1);
if (pad.Buttons&PSP_CTRL_TRIANGLE) break;
while(offset<length)
{
sceCtrlReadBufferPositive(&pad,1);
if (pad.Buttons&PSP_CTRL_TRIANGLE) break;
int sample=16384;
if (length<=offset+sample) sample=length-offset;
sceAudioSetChannelDataLen(channel,sample/2);
memcpy(SampleBuffer,Sound+offset,sample);
sceAudioOutputBlocking(channel,PSP_AUDIO_VOLUME_MAX,SampleBuffer);
offset+=sample;
}
}
free(SampleBuffer);
free(Sound);
sceAudioChRelease(channel);
}
//pspAudioSetChannelCallback(0,audio_callback,NULL);
pspAudioEnd();
//выходим из программы
sceKernelExitGame();
return(0);
}
Как такое может быть, если меняется частота дискретизации?
Представляю мой вариант звуковой библиотеки для игр. Она, впрочем, не позволит играть длительные музыкальные фрагменты, так как все звуки находятся в памяти постоянно.
Итак, как ей пользоваться.
0) Обработкой звука занимается класс CSound, при этом объект cSound создан по умолчанию.
1) Создать функцию обратного вызова:
void audio_callback(void* buf,unsigned int length,void *userdata)
{
cSound.CallBack(buf,length,userdata);
}
2) Привязать эту функцию к классу:
cSound.SetCallBackFunction(audio_callback);
3) Загрузить звук:
cSound.LoadNewSound(FileName,0);//загружаем звуковой файл
0 - это индентификатор звука, т.е. по этому номеру с данным звуком можно будет работать, разумеется, это любое удобное вам число.
4) Запустить звук на выполнение:
cSound.Play(0);
Всё. Одновременно звуков можно запускать довольно много. Т.е. это именно то, что нужно для игры.
Ах да, файлы звуков в собственном примитивном формате - заголовок-длина и сами незапакованные данные. Этот формат делает прилагаемая программа из несжатых wav-файлов с параметрами 44100 на 16 бит, моно. Но это можно переделать при желании.
Последний раз редактировалось Ilsor; 15.08.2008 в 18:49.
44100(частота)x2(байт на выборку)x5(минут)x60 (по 60 секнуд в минуте)= 26 мегабайт в файле и в два раза больше в памяти (т.к. стерео). Их нужно подгружать потихоньку.