Модераторы: Rickert, Alexeis, BorisVorontsov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Механизм проигрывания wav, Механизм проигрывания wav 
V
    Опции темы
batraq
Дата 30.3.2009, 16:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 43
Регистрация: 12.4.2007

Репутация: нет
Всего: нет



День добрый,

Есть вопрос - взялся воспроизводить звук под WinCE на основе книжки "Программирование звука в Windows" Олег Гордеев. Сама прога компилиться отлично, единственная проблема не проигрывается звук, почему-то не срабатывает WaitForSingleObject(). Данные из файла читаются, все хэндлы тоже выглядят правильно.
Код

#include <windows.h>
#include <mmsystem.h>
#include <string.h>
#include "winwav.h"

//=============================================================================

char msg[300] = {0};
HANDLE hFile = 0;
HANDLE hData = 0;
WAVEFORMATEX wfx = {0};
char *soundData = 0;
__int64 DataSize = 0;
__int64 DataOffset = 0;
__int64 FileSize = 0;

//=============================================================================

int WINAPI WinMain(    HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow)
{
    hFile = CreateFile(lpCmdLine, GENERIC_READ, FILE_SHARE_READ, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);

    LoadFile();
    PlayFile();

    CloseHandle(hData);
    CloseHandle(hFile);

    return 0;
}

//=============================================================================

void LoadFile()
{
    __int8 ID[8];
    FileSize = GetFileSize(hFile, 0);
    SetFilePointer(hFile, 8, 0, FILE_BEGIN);

    DWORD BytesReaded = 0;
    ReadFile(hFile, (void*)ID, 8, &BytesReaded, 0);
    if (strncmp(ID, "WAVEfmt ", 8) != 0)
        return;

    DWORD Size = 0;
    ReadFile(hFile, &Size, sizeof(Size), &BytesReaded, 0);
    if (Size > sizeof(wfx))
        return;

    memset(&wfx, 0, sizeof(wfx));
    ReadFile(hFile, &wfx, Size, &BytesReaded, 0);
    if (wfx.wFormatTag != WAVE_FORMAT_PCM)
        return;

    wfx.cbSize = 0;
    ReadFile(hFile, ID, 8, &BytesReaded, 0);
    if (strncmp(ID, "data", 4) != 0)
        return;

    DataSize = *((DWORD*)(void*)(ID + 4));
    soundData = new char[DataSize];
    ReadFile(hFile, soundData, DataSize, &BytesReaded, 0);
}

//=============================================================================

void PlayFile()
{
    int BlockSize = 64 * 1024;
    HANDLE hEvent = CreateEvent(0, FALSE, FALSE, 0);
    int WaitTime = BlockSize * 2000 / (wfx.nAvgBytesPerSec);

    SYSTEM_INFO si = {0};
    GetSystemInfo(&si);

    WAVEHDR Header[2] = {0};

    UINT player = waveOutGetNumDevs();
    WAVEOUTCAPS *caps = new WAVEOUTCAPS[player];
    for (int i = 0; i < player; i++)
        waveOutGetDevCaps(player, &caps[i], sizeof(caps[0]));

    HWAVEOUT hPlay;
    waveOutOpen(&hPlay, WAVE_MAPPER, &wfx, (DWORD) hEvent, 0, CALLBACK_EVENT);

    __try
    {
        Header[0].dwBufferLength = BlockSize;
        Header[0].lpData = new char[Header[0].dwBufferLength];
        Header[1].dwBufferLength = BlockSize;
        Header[1].lpData = new char[Header[1].dwBufferLength];

        waveOutPrepareHeader(hPlay, &Header[0], sizeof(WAVEHDR));
        waveOutPrepareHeader(hPlay, &Header[1], sizeof(WAVEHDR));

        if (DataSize <= BlockSize)
            ResetEvent(hEvent);

        int ii = 0;
        for(__int64 PlayPosition = 0; PlayPosition < DataSize; PlayPosition += BlockSize)
        {
            if (PlayPosition < DataSize)
            {
                WAVEHDR *curhdr = &Header[(ii++) & 1];

                if (BlockSize > DataSize - PlayPosition) 
                    BlockSize = int(DataSize - PlayPosition);

                curhdr -> dwBufferLength = (DWORD)BlockSize;
                curhdr -> lpData = &soundData[PlayPosition];

                waveOutWrite(hPlay, curhdr, sizeof(WAVEHDR));
            }

            if (WAIT_TIMEOUT == WaitForSingleObject(hEvent, WaitTime))
                throw "Не удаётся воспроизвести данные - вышел лимит времени";    
        }
    }
    __finally
    {
        waveOutUnprepareHeader(hPlay, Header, sizeof(WAVEHDR));
        waveOutUnprepareHeader(hPlay, Header + 1, sizeof(WAVEHDR));

        if (Header[0].lpData)
            VirtualFree((void*)Header[0].lpData, 0, MEM_RELEASE);

        waveOutClose(hPlay);
    }

    waveOutUnprepareHeader(hPlay, Header, sizeof(WAVEHDR));
    waveOutUnprepareHeader(hPlay, Header + 1, sizeof(WAVEHDR));

    waveOutClose(hPlay);
    delete [] soundData;
}


Как я понимаю все библиотеки еть в наличии, существует другой плеер который проигрывает этот же не сжатый wav на этом же девайсе. Мало того эта прога скомпилёная под WinXP отлично проигрывает. На девайсе не хочет и все - срабатывает exception
Код

            if (WAIT_TIMEOUT == WaitForSingleObject(hEvent, WaitTime))
                throw "Не удаётся воспроизвести данные - вышел лимит времени";    

Может кто подскажет в чём тонкость
PM MAIL   Вверх
Alexeis
Дата 30.3.2009, 17:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 5
Всего: 459



Цитата(batraq @  30.3.2009,  15:32 Найти цитируемый пост)
существует другой плеер который проигрывает этот же не сжатый wav на этом же девайсе.

  Может у него свой кодек для распаковки?

Добавлено через 58 секунд
Стоит проверить результаты которые возвращают функции, возможно одна из них завершается с ошибкой.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
batraq
Дата 30.3.2009, 17:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 43
Регистрация: 12.4.2007

Репутация: нет
Всего: нет



Нет кодек тут ни при чём, все данные я сам читаю из файла через fopen(). А потом все wav файлы не сжаты.
PM MAIL   Вверх
Alexeis
Дата 30.3.2009, 18:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 5
Всего: 459



Цитата(batraq @  30.3.2009,  16:21 Найти цитируемый пост)
А потом все wav файлы не сжаты. 

  Это совсем не гарантия работы, например у меня встроенный аудиокодек, который понимает только a-low, PCM формат не переваривает. 

  Проверяйте результат который возвращает каждая функция waveOut* . Если что-то не поддерживается, то функция вернет ошибку, дальше по коду ошибки смотрим описание. WinCE это не Windows XP, в нем многое упрощено и часть обычных функций не поддерживается.

Добавлено через 4 минуты и 45 секунд
Вообще не понимаю как у вас работает функция CreateFile.
Код

hFile = CreateFile(lpCmdLine, GENERIC_READ, FILE_SHARE_READ, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);

В Windows CE нет функции CreateFileA, только CreateFileW. И вообще отсутствуют API функции работающие с Ansi строками, разве что только конвертирование.
Проблема может быть связанна именно с этим.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
batraq
Дата 30.3.2009, 21:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 43
Регистрация: 12.4.2007

Репутация: нет
Всего: нет



Попробую продебажить как ты предложил с просмотром кодов возврата. Вроде смотрел и поддержка PCM присутствует. Что до CreateFile() то у меня не совсем обычная сборка WinCE, там много чего есть помимо обычного набора с заточкой под ARM железо.
PM MAIL   Вверх
Alexeis
Дата 30.3.2009, 21:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 5
Всего: 459



Цитата(batraq @  30.3.2009,  20:04 Найти цитируемый пост)
Что до CreateFile() то у меня не совсем обычная сборка WinCE

  Гм... сборки CE, они все разные, но не слышал про ядро которое бы поддерживало ANSI. У меня в SDK стоит дефайн тупо объявляющий что CreateFile это CreateFileW, но мало ли что народ придумает, конечно могут быть и сторонние компоненты, но использование ansi функций уже в NT было неразумным, поскольку всегда посходило конвертирование родной для ядра юникод. В CE же где размер и скорость имеет значение тем более нет смысла работать через промежуточный ansi. Сейчас принято так, работаем с utf16, храним в utf8 или utf8 пожатое zlib. И ни каких проблем с кодировками.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
batraq
Дата 10.4.2009, 14:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 43
Регистрация: 12.4.2007

Репутация: нет
Всего: нет



Вот продебажил код выяснил что на последнем этапе вызов waveOutOpen() возвращает код ошибки 11 - invalid parameter passed. А вот какой параемтр кривой не пойму.

Кроме того просмотрел параметры звукового девайса. Вот они:
Цитата

Audio Output
wMid  1    unsigned short  Manufacturer identifier
wPid  24    unsigned short  Product identifier
vDriverVersion    1    unsigned int
szPname  0x1c02fcbc"Audio Output"    wchar_t[32]
dwFormats    4095    unsigned long int    Standard formats that are supported
  0x0FFF
  111111111111
------------------------------------------
  0000000000
  0000000001
  0000000010
  0000000100
  0000001000
  0000001010
  0000010100
  0000101000
  0001010000
  0001100100
  0011001000
  0110010000
  1100100000

wChannels    1    unsigned short  the device supports mono
wReserved1    0    unsigned short  Packing
dwSupport    14    unsigned long int    Optional functionality supported by the device
  0x0E
  1110
------------------------------------------
  0001    supports pitch control(управление тоном)
  0010    supports playback rate control
  0100    supports volume control
  1000    separate left-right volume control



Больше всего меня смутил параметр dwFormats равный волшебному 0xFFF. Там всего-то ключей существует до 0х3FF. Как такой параметр получился ума не приложу. Кроме этого девайсов по воспроизведению нет в системе больше. Встаёт вопрос если один параметр(wChannels) говорит что поддерживает только mono, то почему dwFormats говорит что может всё?

Может кто подскажет в чём засада
PM MAIL   Вверх
batraq
Дата 10.4.2009, 17:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 43
Регистрация: 12.4.2007

Репутация: нет
Всего: нет



Вдумчиво покурив MSDN выяснил как проверить поддерживает железка формат файла или нет вот так вот делается
Код

    MMRESULT res = 0;
    res = waveOutOpen(0, WAVE_MAPPER, &wfx, 0, 0, WAVE_FORMAT_QUERY);


Если res=0 то всё отлично и можем проиграть, иначе формат не поддерживается. Так что проблема точно не в формате файла(а жаль, так было бы проше)
PM MAIL   Вверх
Alexeis
Дата 10.4.2009, 17:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 5
Всего: 459



Может не умеет работать с CALLBACK_EVENT ? 


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
batraq
Дата 10.4.2009, 18:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 43
Регистрация: 12.4.2007

Репутация: нет
Всего: нет



Нашёл небольшую неточность при чтении формата файла. Похоже что в файле хранится не WAVEFORMATEX  а PCMWAVEFORMAT. Т.е. более старая форма записи. Но это никак не повлияло на проблему. Думаешь не умеет с событиями работать, ладно поробую переписать на CALLBACK функцию
PM MAIL   Вверх
batraq
Дата 13.4.2009, 15:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 43
Регистрация: 12.4.2007

Репутация: нет
Всего: нет



Короче вот код который собирается как под Win32 так и под WinCE. Остаётся понять почему в самый главный момент, а именно при вызове waveOutWrite() она возвращает значение 11 что расшифровывается как не верный параметр. Данные целые и загружены корректно, хэндлы тоже вроде как верные. Девайс в системе есть и находится, а играть не хочет.

Код

#ifdef WIN32
#pragma comment(lib, "winmm.lib")
#endif

//=============================================================================

#include <windows.h>
#include <tchar.h>
#include <mmsystem.h>
#include <string.h>
#include "winwav.h"
#include <stdio.h>

//=============================================================================

FILE *hFile = 0;
WAVEFORMATEX wfx = {0};
char *soundData = 0;
unsigned int wav_data_size = 0;

//=============================================================================

int WINAPI _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow)
{
    hFile = _wfopen(lpCmdLine, L"rb");
    LoadFile();
    PlayFile();
    fclose(hFile);
    return 0;
}

//=============================================================================

void LoadFile()
{
    char riff_sign[5] = {0};
    char wav_sign[9] = {0};
    char wav_data_sign[5] = {0};
    unsigned int riff_size = 0;
    unsigned int wav_header_size = 0;
    PCMWAVEFORMAT pcm = {0};

    fread(riff_sign, sizeof(riff_sign) - 1, 1, hFile);
    if (strncmp(riff_sign, "RIFF", 4) != 0)
        return;
    fread(&riff_size, sizeof(riff_size), 1, hFile);

    fread(wav_sign, sizeof(wav_sign) - 1, 1, hFile);
    if (strncmp(wav_sign, "WAVEfmt ", 8) != 0)
        return;
    fread(&wav_header_size, sizeof(wav_header_size), 1, hFile);
    if (wav_header_size != sizeof(pcm))
        return;

    fread(&pcm, wav_header_size, 1, hFile);
    if (pcm.wf.wFormatTag != WAVE_FORMAT_PCM)
        return;

    wfx.cbSize = 0;
    wfx.nAvgBytesPerSec = pcm.wf.nAvgBytesPerSec;
    wfx.nBlockAlign = pcm.wf.nBlockAlign;
    wfx.nChannels = pcm.wf.nChannels;
    wfx.nSamplesPerSec = pcm.wf.nSamplesPerSec;
    wfx.wBitsPerSample = pcm.wBitsPerSample;
    wfx.wFormatTag = pcm.wf.wFormatTag;

    fread(wav_data_sign, sizeof(wav_data_sign) - 1, 1, hFile);
    if (strncmp(wav_data_sign, "data", 4) != 0)
        return;

    fread(&wav_data_size, 4, 1, hFile);
    soundData = new char[wav_data_size];
    memset(soundData, 0, wav_data_size);
    fread(soundData, wav_data_size, 1, hFile);
}

//=============================================================================

void PlayFile()
{
    unsigned int BlockSize = 64 * 1024;
    HANDLE hEvent = CreateEvent(0, FALSE, FALSE, 0);
    unsigned int WaitTime = BlockSize * 2000 / (wfx.nAvgBytesPerSec);

    WAVEHDR Header[2] = {0};
    HWAVEOUT hPlay;
    MMRESULT res = waveOutOpen(&hPlay, WAVE_MAPPER, &wfx, (DWORD) hEvent, 0, CALLBACK_EVENT);

    Header[0].dwBufferLength = BlockSize;
    Header[0].lpData = new char[Header[0].dwBufferLength];
    Header[1].dwBufferLength = BlockSize;
    Header[1].lpData = new char[Header[1].dwBufferLength];
    res = waveOutPrepareHeader(hPlay, &Header[0], sizeof(WAVEHDR));
    res = waveOutPrepareHeader(hPlay, &Header[1], sizeof(WAVEHDR));

    if (wav_data_size <= BlockSize)
        ResetEvent(hEvent);
    int ii = 0;

    for(unsigned int PlayPosition = 0; PlayPosition < wav_data_size; PlayPosition += BlockSize)
    {
        if (PlayPosition < wav_data_size)
        {
            WAVEHDR *curhdr = &Header[(ii++) & 1];
            if (BlockSize > wav_data_size - PlayPosition) 
                BlockSize = wav_data_size - PlayPosition;
            curhdr -> dwBufferLength = BlockSize;
            curhdr -> lpData = &soundData[PlayPosition];
            res = waveOutWrite(hPlay, curhdr, sizeof(WAVEHDR));
        }
        if (WAIT_TIMEOUT == WaitForSingleObject(hEvent, WaitTime))
            throw "Не удаётся воспроизвести данные - вышел лимит времени";    
    }

    waveOutUnprepareHeader(hPlay, Header, sizeof(WAVEHDR));
    waveOutUnprepareHeader(hPlay, Header + 1, sizeof(WAVEHDR));
    waveOutClose(hPlay);
    delete [] soundData;
}


Я в тупике, нужны мысли, кто сталкивался. Переписывание на CALLBACK функцию ничего не дало. Готов почти отчаяться и впасть в уныние 
PM MAIL   Вверх
batraq
Дата 13.4.2009, 17:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 43
Регистрация: 12.4.2007

Репутация: нет
Всего: нет



Ларчик просто открывался. А всё потому что память которую я выделяю уничтожает waveOutUnprepareHeader(). Не обратил внимания на то, что в примере из книжки данные копировались из массива прочитанного в буфер WAVEHDR. Вот верный код
Код

#ifdef WIN32
#pragma comment(lib, "winmm.lib")
#endif

//=============================================================================

#include <windows.h>
#include <tchar.h>
#include <mmsystem.h>
#include <string.h>
#include "winwav.h"
#include <stdio.h>

//=============================================================================

FILE *hFile = 0;
WAVEFORMATEX wfx = {0};
char *soundData = 0;
unsigned int wav_data_size = 0;

//=============================================================================

int WINAPI _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow)
{
    hFile = _wfopen(lpCmdLine, L"rb");
    LoadFile();
    PlayFile();
    fclose(hFile);
    return 0;
}

//=============================================================================

void LoadFile()
{
    char riff_sign[5] = {0};
    char wav_sign[9] = {0};
    char wav_data_sign[5] = {0};
    unsigned int riff_size = 0;
    unsigned int wav_header_size = 0;
    PCMWAVEFORMAT pcm = {0};

    fread(riff_sign, sizeof(riff_sign) - 1, 1, hFile);
    if (strncmp(riff_sign, "RIFF", 4) != 0)
        return;
    fread(&riff_size, sizeof(riff_size), 1, hFile);

    fread(wav_sign, sizeof(wav_sign) - 1, 1, hFile);
    if (strncmp(wav_sign, "WAVEfmt ", 8) != 0)
        return;
    fread(&wav_header_size, sizeof(wav_header_size), 1, hFile);
    if (wav_header_size != sizeof(pcm))
        return;

    fread(&pcm, wav_header_size, 1, hFile);
    if (pcm.wf.wFormatTag != WAVE_FORMAT_PCM)
        return;

    wfx.cbSize = 0;
    wfx.nAvgBytesPerSec = pcm.wf.nAvgBytesPerSec;
    wfx.nBlockAlign = pcm.wf.nBlockAlign;
    wfx.nChannels = pcm.wf.nChannels;
    wfx.nSamplesPerSec = pcm.wf.nSamplesPerSec;
    wfx.wBitsPerSample = pcm.wBitsPerSample;
    wfx.wFormatTag = pcm.wf.wFormatTag;

    fread(wav_data_sign, sizeof(wav_data_sign) - 1, 1, hFile);
    if (strncmp(wav_data_sign, "data", 4) != 0)
        return;

    fread(&wav_data_size, 4, 1, hFile);
    soundData = new char[wav_data_size];
    memset(soundData, 0, wav_data_size);
    fread(soundData, wav_data_size, 1, hFile);
}

//=============================================================================

void PlayFile()
{
    unsigned int BlockSize = 64 * 1024;
    HANDLE hEvent = CreateEvent(0, FALSE, FALSE, 0);
    unsigned int WaitTime = BlockSize * 2000 / (wfx.nAvgBytesPerSec);

    WAVEHDR Header[2] = {0};
    HWAVEOUT hPlay;
    waveOutOpen(&hPlay, WAVE_MAPPER, &wfx, (DWORD) hEvent, 0, CALLBACK_EVENT);
    MMRESULT res = 0;

    Header[0].dwBufferLength = BlockSize;
    Header[0].lpData = new char[Header[0].dwBufferLength];
    Header[1].dwBufferLength = BlockSize;
    Header[1].lpData = new char[Header[1].dwBufferLength];
    waveOutPrepareHeader(hPlay, &Header[0], sizeof(WAVEHDR));
    waveOutPrepareHeader(hPlay, &Header[1], sizeof(WAVEHDR));

    if (wav_data_size <= BlockSize)
        ResetEvent(hEvent);
    int ii = 0;

    unsigned int sizer = sizeof(WAVEHDR);
    for(unsigned int PlayPosition = 0; PlayPosition < wav_data_size; PlayPosition += BlockSize)
    {
        if (PlayPosition < wav_data_size)
        {
            WAVEHDR *curhdr = &Header[(ii++) & 1];
            if (BlockSize > wav_data_size - PlayPosition) 
                BlockSize = wav_data_size - PlayPosition;
            curhdr -> dwBufferLength = BlockSize;
//==============================================================
//Вот здесь необходимо копировать!!!
            memcpy(curhdr -> lpData, &soundData[PlayPosition], curhdr -> dwBufferLength);
//==============================================================
            //curhdr -> lpData = &soundData[PlayPosition];
            res = waveOutWrite(hPlay, curhdr, sizer);
        }
        if (WAIT_TIMEOUT == WaitForSingleObject(hEvent, WaitTime))
            throw "Не удаётся воспроизвести данные - вышел лимит времени";    
    }

    waveOutUnprepareHeader(hPlay, Header, sizeof(WAVEHDR));
    waveOutUnprepareHeader(hPlay, Header + 1, sizeof(WAVEHDR));
    waveOutClose(hPlay);
    delete [] soundData;
}



И как выяснилось крыша едет у WindowsCE, в то время как на PC всё хорошо
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Вы можете найти полезным что...
Alexeis
Rickert
  • Английская документация по DirectX лежит где-то здесь.
  • Английская документация по OpenGL лежит где-то там.
  • Гейм-дев у нас обсуждают где-то тут

Ждём вас! С уважением, Alexeis, Rickert.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Мультимедия, OpenGL/DirectX | Следующая тема »


 




[ Время генерации скрипта: 0.1441 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.