commandread.cpp

来自「把doc文档转成pdf后刻录成CD,用VC++开发,用了Nero的SDK和CXI」· C++ 代码 · 共 173 行

CPP
173
字号
/******************************************************************************
|* THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF
|* ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO
|* THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
|* PARTICULAR PURPOSE.
|* 
|* Copyright 1995-2004 Ahead Software AG. All Rights Reserved.
|*-----------------------------------------------------------------------------
|* NeroSDK / NeroCmd
|*
|* PROGRAM: CommandRead.cpp
|*
|* PURPOSE: Perform DAE (digital audio extraction)
******************************************************************************/


#include "stdafx.h"
#include "BurnContext.h"


// This function performs DAE (digital audio extraction).

CExitCode CBurnContext::CommandRead (const PARAMETERS & params)
{
	// Make sure that NeroGetCDInfo has not been called before to prevent multiple 
	// allocation of memory for NERO_CD_INFO.

	_ASSERTE (m_NeroCDInfo == NULL);

	// First, get the CD info.
	// NeroGetCDInfo retrieves a pointer to a NERO_CD_INFO structure for the specified device.
	// The allocated memory for the structure has to be freed by using  NeroFreeMem().
	// NULL will be returned if an error occurred.

	m_NeroCDInfo = NeroGetCDInfo (m_NeroDeviceHandle, NGCDI_READ_CD_TEXT);
	if (NULL == m_NeroCDInfo)
	{
		return EXITCODE_ERROR_GETTING_CD_INFO;
	}

	// Loop through the user supplied list of tracks.

	for (int i = 0; i < params.GetNumberOfTracks(); i++)
	{
		NERO_TRACK_INFO* pTrackInfo = NULL;
		NERO_CALLBACK callback;
		NERO_DATA_EXCHANGE exchange;

		// Find the track among the existing tracks on the CD.

		for (unsigned int j = 0; j < m_NeroCDInfo->ncdiNumTracks; j ++)
		{
			if (m_NeroCDInfo->ncdiTrackInfos[j].ntiTrackNumber == params.GetTrackNumber(i))
			{
				pTrackInfo = &m_NeroCDInfo->ncdiTrackInfos[j];
				break;
			}
		}

		// If the track could not be found pTrackInfo still contains NULL

		if (NULL == pTrackInfo)
		{
			// If the track was not found, report an error.

			m_ErrorLog.printf ("Track %d for file '%s' was not found on CD\n", params.GetTrackNumber(i), params.GetTrackFileName(i));

			return EXITCODE_TRACK_NOT_FOUND;
		}
		
		// Track found, now extract the audio data.

		callback.ncCallbackFunction = ProgressCallback;
		callback.ncUserData = &s_NeroSettings;

		// Find the file extension the user supplied for the file 
		// that will contain the extracted data.
		// Supported extensions are WAV and PCM.

		// Try to find the file extension by looking for '.' from the right

		char* psExt = (char*)strrchr (params.GetTrackFileName(i), '.');

		// stricmp performs a lowercase comparison and returns 0 if the strings are identical.

		if ((NULL != psExt) && (0 == stricmp (psExt, ".wav")))
		{
			// WAV files require NERO_ET_FILE as data exchange type

			exchange.ndeType = NERO_ET_FILE;

			// Use the long version of the filename instead of the
			// deprecated short one.
			// 
			exchange.ndeData.ndeLongFileName.reserved = 0;
			exchange.ndeData.ndeLongFileName.ptr = params.GetTrackFileName(i);
		}
		else if ((NULL != psExt) && (0 == stricmp (psExt, ".pcm")))
		{
			// PCM files require NEOR_ET_IO_CALLBACK to exchange data directly

			exchange.ndeType = NERO_ET_IO_CALLBACK;

			// Set the required callbacks

			exchange.ndeData.ndeIO.nioIOCallback = WriteIOCallback;
			exchange.ndeData.ndeIO.nioEOFCallback = EOFCallback;
			exchange.ndeData.ndeIO.nioErrorCallback = ErrorCallback;
			
			// fopen with mode "wb" opens an empty file for writing in binary (untranslated) mode. If the given file exists, its contents are destroyed. 
			// Translations involving carriage-return and linefeed characters are suppressed. 
			
			exchange.ndeData.ndeIO.nioUserData = fopen (params.GetTrackFileName(i), "wb");

			// Make sure that the file could be openend

			if (0 == exchange.ndeData.ndeIO.nioUserData)
			{
				m_ErrorLog.printf ("Cannot open target file %s\n", params.GetTrackFileName(i));

				return EXITCODE_ERROR_OPENNING_FILE;
			}
		}
		else
		{
			// We did not recognize the file extension.

			m_ErrorLog.printf ("Unknown file type for writing of %s\n", params.GetTrackFileName(i));

			return EXITCODE_UNKNOWN_FILE_TYPE;
		}

		// Print track number and file name

		printf ("%02d. '%s':\n", params.GetTrackNumber(i), params.GetTrackFileName(i));

		// Do the actual audio extraction.
		// Aborting will not be reported by NeroGetLastError().
		// Incomplete target files are not deleted.
		// 0 is returned if the operation was successful.

		int res = NeroDAE (m_NeroDeviceHandle,
							pTrackInfo->ntiTrackStartBlk,
							pTrackInfo->ntiTrackLengthInBlks,
							&exchange,
							params.GetReadSpeed (),
							&callback);

		// If we extracted PCM the data file needs to be closed

		if (exchange.ndeType == NERO_ET_IO_CALLBACK)
		{
			// Close the file handle if we opened it.

			if (0 != exchange.ndeData.ndeIO.nioUserData)
			{
				fclose ((FILE *) exchange.ndeData.ndeIO.nioUserData);
			}
		}

		// If NeroDAE did not return 0 the operation failed.

		if (0 != res)
		{
			return EXITCODE_DAE_FAILED;
		}

		printf ("\n");
	}

	return EXITCODE_OK;
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?